2015-01-07 65 views
0

這是一個示例表選擇最近的記錄爲每個組用SUM函數

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 

回答

4

既然你被超過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

1

這將工作,只要你沒有牛逼WO與同第二創建的同一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; 
+1

Upvoted因爲這是更通用的SQL適用於大多數RDBMS和也是它比使用'OVER PARTITION'做更清晰。 – Turophile