我有以下数据。我希望在获取最新的余额,描述和日期值时聚合兴趣字段。
数据
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的记录要处理,因此性能也是一个挑战。
答案 0 :(得分:3)
我们可以使用两个窗口函数SUM
和DENSE_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;
大部分时间在Stack Overflow上,你可能会看到使用ROW_NUMBER
代替RANK
。如果将两个记录绑定为最新记录,我更喜欢使用某种排名。很容易丢弃你不想要的信息,例如其中一个关系,但如果不存在则很难将其带入。
<强>输出:强>
在这里演示:
答案 1 :(得分:3)