根据百分比查询投票表顶部项目
Posted
技术标签:
【中文标题】根据百分比查询投票表顶部项目【英文标题】:Query Votes table top items based on a percentage 【发布时间】:2015-05-20 04:57:58 【问题描述】:我有一张投票表,如下所示:
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 进行查询。 【参考方案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. 获得总票数、总票数、总票数、百分比和总和。以上是关于根据百分比查询投票表顶部项目的主要内容,如果未能解决你的问题,请参考以下文章