2017-09-07 1 views
1

다음과 같은 데이터가 있습니다. 관심 분야에 대해 집계하고 Balance, Description 및 Date의 최신 값을 가져 오려고합니다. 성능도 도전 있도록하나의 필드를 모으고 다른 필드의 최신 값을 선택하십시오.

데이터

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

감사합니다. @ 엘리! 수정 됨. – SVaidya

답변

3

SUMDENSE_RANK의 두 가지 창 함수를 사용하여 원하는 출력을 얻을 수 있습니다. 계정의 각 레코드 순위를 할당 할 수있는 동안 관심을 각 계정에 대해 합계 할 수 있습니다. 그런 다음 가장 최근 날짜가있는 각 그룹의 레코드를 보유하십시오. 당신은 아마 ROW_NUMBER를 볼 것이다 스택 오버플로에 대부분의 시간을

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; 

대신 RANK의 사용. 가장 최근의 레코드로 두 레코드를 묶는 경우 일종의 순위를 선호합니다. 원하지 않는 정보를 버리는 것은 쉽습니다 (예 : 동점의 하나, 그러나 이미 거기에서 가져 오지 않는 경우에.

출력 : 여기

enter image description here

데모 :

Rextester

3

또 다른 옵션은 끈으로 절입니다

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은 이미 있습니다. –

관련 문제