2017-09-07 1 views
1

次のようなデータがあります。私は、Balance、Description、Dateの最新の値を取得しながら、Interestフィールドを集計したい。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日の日付を示していますか?そのアカウントの最新データは、2011年9月1日でないとしますか? – Eli

+0

ありがとう@Eli!修正されました。 – SVaidya

答えて

3

SUMDENSE_RANKという2つのウィンドウ関数を使用して、必要な出力を得ることができます。アカウント内の各レコードのランクを割り当てることができる一方で、各アカウント上で金利を合計することができます。次に、最新の日付を持つ各グループのレコードを保持します。スタックオーバーフロー上のほとんどの時間

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の使用されて見るでしょう。私は、2つのレコードが最新であると結論付けられた場合に、何らかのランクを使用することを好みます。あなたが望まない情報を捨てるのは簡単です。その関係の一つであるが、まだそこになければそれを持ち込むことは難しい。

出力:ここ

enter image description here

デモ:

Rextester

3

さらに別のオプションは、TIES WITH 句である

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。 –

関連する問題