使用求和函数为每个组选择最近的记录

Selecting most recent record for each group with a sum function

这是一个示例表

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

由于您分组的依据不止 ID,但希望 SUM()ID 级别,您可以将 OVER() 添加到 SUM() :

;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

只要您没有在同一秒内创建具有相同 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;