2017-09-07 77 views
1

我有如下的數據。我想彙總興趣領域,同時選取餘額,描述和日期的最新值。彙總一個字段並獲取另一個字段的最新值

數據

Date || AccNum||ID      ||Balance ||Curncy||Interest||Description 
========||=======||=======================||========||======||========||=========== 
7/1/2017|| DEPA1 ||HKGCIFSRCKEY002DEPA1SGD||1000 ||SGD ||0  ||Open 
8/1/2017|| DEPA1 ||HKGCIFSRCKEY002DEPA1SGD||1010 ||SGD ||10  ||Open 
9/1/2017|| DEPA1 ||HKGCIFSRCKEY002DEPA1SGD||1020 ||SGD ||10  ||Closed 
6/1/2017|| DEPA2 ||HKGCIFSRCKEY002DEPA2SGD||10000 ||SGD ||0  ||Open 
7/1/2017|| DEPA2 ||HKGCIFSRCKEY002DEPA2SGD||10100 ||SGD ||100  ||Open 
8/1/2017|| DEPA2 ||HKGCIFSRCKEY002DEPA2SGD||10200 ||SGD ||100  ||Open 
9/1/2017|| DEPA2 ||HKGCIFSRCKEY002DEPA2SGD||10300 ||SGD ||100  ||Dormant 

預期結果

Date || AccNum||ID      ||Balance ||Curncy||Interest||Description 
========||=======||=======================||========||======||========||=========== 
9/1/2017|| DEPA1 ||HKGCIFSRCKEY002DEPA1SGD||1020 ||SGD ||20  ||Closed 
9/1/2017|| DEPA2 ||HKGCIFSRCKEY002DEPA2SGD||10300 ||SGD ||300  ||Dormant 

我有大約30M的記錄要處理這樣的表現,也是一個挑戰。

+1

你爲什麼顯示在DEPA1預期結果的2017年7月1日的日期?不應該是9/1/2017,因爲這是該帳戶的最新數據? – Eli

+0

謝謝@Eli!糾正。 – SVaidya

回答

3

我們可以使用兩個窗口函數SUMDENSE_RANK來獲得你想要的輸出。利息可以彙總在每個賬戶上,而賬戶中每個記錄的等級可以被分配。然後,保留每個有最近日期的組的記錄。

SELECT 
    t.Date, t.AccNum, t.ID, t.Balance, t.Curncy, t.Interest, t.Description 
FROM 
(
    SELECT Date, AccNum, ID, Balance, Curncy, Description, 
     SUM(Interest) OVER (PARTITION BY AccNum) AS Interest, 
     RANK() OVER (PARTITION BY AccNum ORDER BY Date DESC) rank 
    FROM yourTable 
) t 
WHERE t.rank = 1; 

大部分的堆棧溢出,你可能會看到ROW_NUMBER的時間被用來代替RANK。如果兩個記錄被視爲最近的記錄,我寧願使用某種排名。很容易丟棄你不想要的信息,例如其中一個關係,但如果不是已經存在的話,很難把它帶入。

輸出:

enter image description here

演示在這裏:

Rextester

3

另一個選擇是與WITH TIES條款

Select Top 1 with Ties 
     Date 
    ,AccNum 
    ,ID 
    ,Balance 
    ,Curncy 
    ,Interest = sum(Interest) over (Partition By AccNum,ID) 
    ,Description 
From YourTable 
Order By Row_Number() over (Partition By AccNum,ID Order By Date Desc) 

返回

enter image description here

+0

這似乎是我的答案,它使用額外的子查詢首選。如果您想爲每個帳戶選擇關係,則可以使用排名功能而不是行號+1來排序。 –

+1

@TimBiegeleisen謝謝。我看到了你對RANK和ROW_NUMBER的評論。你是對的,但這取決於OP將如何使用結果。 RN會避免重複計算..無論如何已經爲RANK評論/區別+1。 –

相關問題