최대 날짜를 기준으로 여러 행으로 결과 집합 반환


16

다음과 같은 자식 테이블이 있습니다.

[Cust Date Table]

| Customer ID | Some Date  | Balance |
+-------------+------------+---------+
|           1 | 2012-04-30 |   20.00 |
|           1 | 2012-03-31 |   50.00 |
|           2 | 2012-04-30 |    0.00 |
|           2 | 2012-03-31 |   10.00 | 
|           3 | 2012-03-31 |   60.00 |
|           3 | 2012-02-29 |   10.00 |

다음과 같은 결과 집합을 얻을 수 있기를 원합니다. 최신 날짜를 가진 각 클라이언트마다 하나의 레코드입니다.

| Customer ID | Some Date  | Balance |
+-------------+------------+---------+
|           1 | 2012-04-30 |   20.00 | 
|           2 | 2012-04-30 |    0.00 |
|           3 | 2012-03-31 |   60.00 |

다음 SQL (SQL Server 구문)을 사용하여 개별 "고객 ID"마다이 작업을 수행 할 수 있습니다.

select top 1  [Some Date], [Customer ID], [Balance]
from [Cust Date Table]
where [Customer ID] = 2
order by [Some Date] desc


| Customer ID | Some Date  | Balance |
+-------------+------------+---------+
|           2 | 2012-04-30 |    0.00 |

그러나 원하는 세 가지 레코드를 모두 얻는 방법을 잘 모르겠습니다. 이것이 하위 쿼리 또는 다른 것을 요구하는 상황인지 확실하지 않습니다.

지정된 [고객 ID]마다 최대 날짜가 다를 수 있습니다 (이 예에서는 고객 3의 최대 날짜는 2012-03-31이지만 다른 레코드의 최대 날짜는 2012-04-30 임). 나는 시도했다

select [Customer ID], MAX([Some Date]) AS [Latest Date], Balance 
from [Cust Date Table] 
group by [Customer ID], Balance; 

문제는 각 고객에 대해 한 행만 반환하지 않고 여러 행을 반환한다는 것입니다.

답변:


18

당신은 단순히 원합니다 :

SELECT
    [Customer ID],
    MAX([Some Date]) AS[Latest Date]
FROM[Cust Date TABLE]
GROUP BY
    [Customer ID];

좋아-당신은 그것을 수정했습니다. 이제 행을 주문하고 맨 위 행을 선택하십시오.

WITH numbered AS (
    SELECT
        [Customer ID],
        [Some Date],
        [Balance],
        ROW_NUMBER() OVER (
            PARTITION BY
                [Customer ID]
            ORDER BY
                [Some Date] DESC
        ) AS rownum
    FROM[Cust Date TABLE]
)
SELECT
    [Customer ID],
    [Some Date],
    [Balance]
FROM numbered
WHERE
    rownum = 1;

오-질문을 바꿨 니?
Rob Farley

지금 내 대답을 변경했습니다.
Rob Farley

이 솔루션의 한 가지 장점 (또는 요구 사항에 따라 단점)은 최신 날짜가 동일한 고객에 대해 둘 이상의 행에서 발생하면 중복 된 결과가 생성되지 않는다는 것입니다.
Tim

7

난 당신이 이런 식으로 생각

select c.[customer ID], [some date], balance
from [cust date table] c
inner join 
    ( select [customer ID], MAX([some date]) as maxdate
    from [cust date table]
    group by [customer ID]) c2
on c2.[customer ID] = c.[customer ID]
and c2.maxdate = c.[some date]

여기에는 CTE, 테이블 변수, #table과 같은 여러 가지 변형이 있으며 상황에서 최고의 성능을 제공하는 것을 확인할 수 있습니다.


이 답변도 정확합니다. 불행히도 나는 그것을 표명하기에 충분한 담당자가 없으며 하나의 답변을 선택해야합니다.
Joe DBA
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.