汇总一个字段并获取另一个字段

时间:2017-09-07 16:59:10

标签: sql-server group-by aggregate-functions

我有以下数据。我希望在获取最新的余额,描述和日期值时聚合兴趣字段。

数据

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的记录要处理,因此性能也是一个挑战。

2 个答案:

答案 0 :(得分: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;

大部分时间在Stack Overflow上,你可能会看到使用ROW_NUMBER代替RANK。如果将两个记录绑定为最新记录,我更喜欢使用某种排名。很容易丢弃你不想要的信息,例如其中一个关系,但如果不存在则很难将其带入。

<强>输出:

enter image description here

在这里演示:

Rextester

答案 1 :(得分: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