2017-09-07 81 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。 –

相关问题