根据百分比查询投票表顶部项目

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. 获得总票数、总票数、总票数、百分比和总和。

以上是关于根据百分比查询投票表顶部项目的主要内容,如果未能解决你的问题,请参考以下文章

struts2和DBUtils结合做的一个投票系统练习

基于php004网络投票在线投票系统

sql建表问题

根据表 B 的拆分百分比雪花拆分表 A 的整数列

Storyboard iOS - 如何将顶部边距作为屏幕尺寸的百分比而不是静态值顶部引脚边距?

实现投票,显示人数百分比的功能