3

我有一个数据集,我需要对其进行一些聚合才能显示。

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 查询方法。

4

2 回答 2

2

这样做:

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, Rank

SQLFIDDLE

于 2013-07-26T16:35:39.683 回答
0

我能看到的最直接的方式就是你已经指出的。

使用按 SQL 分组:

SELECT  date, rank, SUM(vote) FROM YourTable
GROUP BY date, rank

小提琴演示:http ://sqlfiddle.com/#!2/d65d5c/3

在您的程序中遍历此记录集并执行获取数据所需的操作。(如果你用编程语言标记你的问题,我可以告诉你如何)。

所以基本上不,我看不到任何更好的方法来做到这一点。据我所知,这最终会导致一个相当复杂且缓慢的 SQL 查询。但也许有人可以教我更好。

于 2013-07-26T16:38:31.320 回答