2016-01-21 35 views
0

嗨stackoverflow社區,如何生成聚合的最新信息?

我有一張表Sales,假設如下所示。

Customer  Revenue  State  Date 
David   $100   NY   2016-01-01 
David   $500   NJ   2016-01-03 
Fred   $200   CA   2016-01-01 
Fred   $200   CA   2016-01-02 

我正在寫一個客戶產生的收入的簡單查詢。輸出返回如下:

David  $600 
Fred  $400 

我現在想要做的是添加最新購買日期的行。

期望的結果:

David  $600  2016-01-03 
Fred  $400  2016-01-02 

我想保持SQL代碼儘可能乾淨。我也想避免對新查詢執行JOIN,因爲此查詢可能開始變得複雜。有關如何這樣做的任何想法?

+0

查找頂正每組或最大正按組。對於SQL Server,請參閱[檢索每個組的n行](http://dba.stackexchange.com/questions/86415/retrieving-n-rows-per-group)。 –

+0

請記住,如果有幫助,您可以接受答案。 – timgeb

回答

2

您應該將收入彙總到您的組中,並獲取最大日期。

事情是這樣的:

SELECT 
    Customer, SUM(Revenue) as RevenueSum, MAX([Date]) as [Date] 
FROM Sales 
GROUP BY Customer 
+0

如果我想要最新狀態怎麼辦? – mlh351

+0

最新狀態+最新日期@Hamlet Hakobyan – mlh351

+0

@MichaelHwang:這是另外一個問題。用適當的標題和描述創建問題。您可以添加我可以輕鬆找到的新問題的鏈接。 –

0

我認爲這是你所需要的

選擇客戶,金額(收入),最大銷售組(日期)客戶

0

的一種方式獲取收入的SUM,並從MAX記錄中獲取信息。日期是使用ROW_NUMBER()和SUM()窗口函數。

SUM() OVER()會將客戶的總和應用於每一行,並且ROW_NUMBER() OVER()會按客戶和日期DESC給每行一個訂單號。

在子查詢將這個選擇只與1(最大日)ROW_NUMBER記錄

SELECT [Customer], 
     [Revenue], 
     [State], 
     [Date] 
FROM (SELECT [Customer], 
       SUM([Revenue]) OVER (PARTITION BY [Customer]) [Revenue], 
       [State], 
       [Date], 
       ROW_NUMBER() OVER (PARTITION BY [Customer] ORDER BY [Date] DESC) Rn 
     FROM Sales 
     ) t 
WHERE t.Rn = 1