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


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.