使用求和功能为每个组选择最近的记录

时间:2015-01-07 03:06:33

标签: sql sql-server

这是一个示例表

ID | Serial | Quantity | Date_Created
-------------------------------------
 1 | AS1GD  |    10    | 2014-12-25 8:00:00 AM
 1 | GO9A4  |     5    | 2014-12-28 9:04:32 AM
 2 | JF8WS  |    15    | 2014-12-29 9:23:43 AM
 2 | JFLE0  |    15    | 2015-01-04 10:53:12 AM
 2 | S8A4A  |    10    | 2015-01-05 9:12:46 AM
 3 | FXOE3  |    20    | 2015-01-03 9:31:52 AM
 3 | LSOR9  |    22    | 2015-01-06 12:00:44 PM

我的预期结果

ID | Serial | Total_Quantity | Last_DateCreated
-------------------------------------------------
 1 | GO9A4  |     15         | 2014-12-28 9:04:32 AM
 2 | S8A4A  |     40         | 2015-01-05 9:12:46 AM
 3 | LSOR9  |     42         | 2015-01-06 12:00:44 PM

这是我试过的一个查询,但它并没有返回总和而只返回记录的数量

WITH total AS
( SELECT [ID], [date_created], [serial], sum(quantity) as qty,  
 ROW_NUMBER() OVER (PARTITION BY [ID] ORDER BY [date_created] DESC) AS rownum
 FROM [table]
group by ID, date_created, serial
)
SELECT ID, Serial, qty, date_created
FROM total
WHERE rownum = 1

2 个答案:

答案 0 :(得分:4)

由于您的分组数量超过ID但希望SUM()级别为ID,因此您可以OVER()添加SUM():< / p>

;WITH total AS ( SELECT [ID]
                      , [date_created]
                      , [serial]
                      , SUM(SUM(quantity)) OVER(PARTITION BY [ID]) as qty
                      , ROW_NUMBER() OVER (PARTITION BY [ID] ORDER BY [date_created] DESC) AS rownum
                FROM [table]
                GROUP BY ID, date_created, serial
                )
SELECT ID, Serial, qty, date_created
FROM total
WHERE rownum = 1

上面创建了一个奇怪的地方,你需要两个SUM()来使用OVER(),但你可以在你的例子中完全抛弃GROUP BY

;WITH total AS ( SELECT [ID]
                      , [date_created]
                      , [serial]
                      , SUM(quantity) OVER(PARTITION BY [ID]) as qty
                      , ROW_NUMBER() OVER (PARTITION BY [ID] ORDER BY [date_created] DESC) AS rownum
                FROM Table1
                )
SELECT ID, Serial, qty, date_created
FROM total
WHERE rownum = 1

演示:SQL Fiddle

答案 1 :(得分:1)

只要您没有在同一秒内创建相同ID的两条记录,这将有效:

WITH RecentSUM AS
(
   SELECT ID, MAX(DateCreated) DateCreated, SUM(Quantity) TotalQuantity
   FROM [table]
   GROUP BY ID
)
SELECT t.ID, t.Serial, r.TotalQuantity, r.DateCreated
FROM RecentSUM r
INNER JOIN [table] t ON t.ID = r.ID and t.DateCreated=r.DateCreated;