我有一个数据集,需要对其进行一些聚合才能显示。
Date, Rank, Vote
07/20/2013, 8, -1
07/21/2013, 8, -1
07/23/2013, 7, -1
07/24/2013, 6, 1
07/25/2013, 7, 1
07/26/2013, 7, -1
07/27/2013, 8, 1
07/28/2013, 8, 1
07/29/2013, 8, -1我想按照连续的排名进行分组,总结投票结果,并选择第一个分组日期。上述数据集将返回:
07/20/2013,8,-2
07/23/2013,7,-1
07/24/2013,6,1
07/25/2013,7,0
07/27/2013,8,1我的第一个想法是按日期和等级分组,但这不能巩固好几天。我可以通过循环数据来实现这一点,也可以在存储过程中使用游标,但我很好奇是否有一种更简单的SQL查询方式。
发布于 2013-07-26 16:35:39
这就做到了:
SELECT firstDate, Rank, SUM(vote) Votes
FROM (
SELECT @first_date := CASE WHEN Rank = @prev_rank
THEN @first_date
ELSE Date
END firstDate,
@prev_rank := Rank curRank,
data.*
FROM (SELECT @first_date := NULL, @prev_rank := NULL) init
JOIN (SELECT Date, Rank, Vote
FROM MyTable
Order by Date) data
) grouped
GROUP BY firstDate, RankSQLFIDDLE
发布于 2013-07-26 16:38:31
我能看到的最直截了当的方式,就是你已经指出的。
通过SQL使用:
SELECT date, rank, SUM(vote) FROM YourTable
GROUP BY date, rank小提琴演示:http://sqlfiddle.com/#!2/d65d5c/3
在您的程序中迭代这个记录集,并执行获取数据所需的操作。(如果你用编程语言标记你的问题,我可以告诉你怎么做)。
所以基本上不,我找不到更好的方法了。据我所知,这最终将是一个相当复杂和缓慢的SQL查询。但也许有人能教我更好。
https://stackoverflow.com/questions/17886292
复制相似问题