【问题标题】:Query Votes table top items based on a percentage根据百分比查询投票表顶部项目
【发布时间】:2023-04-10 02:58:02
【问题描述】:

我有一张投票表,如下所示:

id, type, scope, region, UserId, ItemId, updatedAt, createdAt

我正在尝试根据赞成票/总票数按百分比计算排名靠前的项目。

最后一点是我想要一个 WHERE 子句,用于在两个时间戳之间为 createdAt 投票。

我觉得查询获取统计信息是一件很正常的事情。但我不知道该怎么做。

我得到的最接近的是:

SELECT "Votes"."ItemId", count("Votes"."ItemId") tots, count("Votes"."type" = 'up') AS yes, count("Votes"."type" = 'down') AS NO
FROM "Votes"
WHERE "Votes"."ItemId" IN (
    SELECT "Votes"."ItemId" FROM "Votes"
)
GROUP BY "Votes"."ItemId"

这与需求相去甚远。因此,为什么我会在这里得到一些帮助。很难在这类东西上找到好的 sql 资源。

【问题讨论】:

  • 你用的是sql server还是mysql还是postgresql?
  • 为什么不使用 1/-1 存储投票的上/下,以便更容易获得投票总和?只是一个侧面的想法。
  • 我正在使用 postgresql 进行查询。

标签: sql database postgresql count postgresql-9.4


【解决方案1】:

您可以使用CASE 语句对每个赞成票使用 1,对每个反对票使用 -1 并获得它们的总和

SELECT ItemId, SUM(CASE [type] WHEN 'up' THEN 1 WHEN 'down' THEN -1 END)
FROM Votes
WHERE createdAt >= 'startTime'
AND createdAt <= 'endTime'
GROUP BY ItemId

【讨论】:

  • 这确实是一种有趣的查询方式。我想我想做的一件事是取回项目数据,这些数据实际上只是增加了向上、向下、总计和百分比。我真的很喜欢这种为总和选择它们的方式,所以即使添加它也可能非常棒。
  • Giorgi Nakeuri 的答案是我的完整版本,满足您的所有要求。您只需要添加WHERE 子句
【解决方案2】:

您可以使用条件聚合来做到这一点:

select itemid, 
       sum(case when type = 'up' then 1 else 0 end) up,
       sum(case when type = 'down' then 1 else 0 end) down,
       sum(1) total,
       100.0*sum(case when type = 'up' then 1 else 0 end)/sum(1) upperc,
       100.0*sum(case when type = 'down' then 1 else 0 end)/sum(1) downperc
from votes
group by itemid

小提琴http://sqlfiddle.com/#!15/1337d/6

【讨论】:

  • 这很棒。我现在非常接近我希望的结果。 SELECT "ItemId", sum(CASE WHEN type = 'up' THEN 1 ELSE 0 end) up, sum(CASE WHEN type = 'down' THEN 1 ELSE 0 end) down, sum(1) total, round(100.0*sum (CASE WHEN type = 'up' THEN 1 ELSE 0 end)/sum(1), 2) 百分比,sum(CASE WHEN type = 'up' THEN 1 ELSE -1 end)来自“Votes” WHERE “Votes”。 createdAt" BETWEEN '2015-05-19T20:00:00+00:00' AND '2015-05-20T00:00:00+00:00' GROUP BY "ItemId" ORDER BY SUM DESC
  • 感谢@giorgi-nakeuri 有很多东西要学。甚至不知道从哪里开始。
  • 有没有办法根据查询获得附加到这些的排名?像 1-100?
  • 基本上我需要这样做。 1. 获取 X createdAt 日期的所有项目。 2. 统计这些项目的所有投票 3. 按他们投票的排名排序。 1-X 4. 获得总票数、总票数、总票数、百分比和总和。
猜你喜欢
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-17
  • 2022-08-10
相关资源
最近更新 更多