2017-02-14 3 views
2

I MSSQL에서 다음과 같은 데이터가 순서를 존중 마지막 값을 선택 : "시간의 순서를"유지하면서그룹에 의해 시간

declare @TEMP table (Period int, Color varchar(20), Rate int) 
insert into @TEMP values(201601, 'Blue', 10) 
insert into @TEMP values(201602, 'Blue', 10) 
insert into @TEMP values(201603, 'Blue', 11) 
insert into @TEMP values(201604, 'Red', 11) 
insert into @TEMP values(201605, 'Red', 12) 
insert into @TEMP values(201606, 'Blue', 13) 
insert into @TEMP values(201607, 'Blue', 13) 
insert into @TEMP values(201608, 'Blue', 14) 
insert into @TEMP values(201609, 'Blue', 14) 
insert into @TEMP values(201610, 'Blue', 14) 
insert into @TEMP values(201611, 'Blue', 14) 
insert into @TEMP values(201612, 'Blue', 14) 

SELECT * FROM @TEMP 

나는 색상으로 그룹에하고자합니다. 따라서 처음 3 개의 파란색 레코드는 마지막 7 개의 파란색 레코드와 독립적으로 그룹화됩니다. 결국 그룹 내의 "최신"행을 선택하고 싶습니다.

출력은 다음과 같습니다

Period | Color | Rate 
    ------ | ----- | ---- 
    201603 | Blue | 11 
    201605 | Red  | 12 
    201612 | Blue | 14 
    ------ | ----- | ---- 
+0

는'SQL에는 첫 번째와 마지막입니다해야 샘플 데이터에 대한 – TheGameiswar

+0

과 같이 하나의 그룹에 속하고 다른 그룹에 속해 있습니다. – TheGameiswar

+0

DDL을 보내 주셔서 감사 합니다만, 필요하지 않으면 pls는 (MAX) 데이터 유형을 사용하지 않습니다. – dean

답변

0

나는 때문에 윈도우 기능, 당신은 SQL 서버의 일부 최신 버전을 사용 바랍니다. 여기

솔루션 : 당신이 ..There에 의해 주문 될 때까지, 처음 3 개 블루 레코드가 지난 7 파란색 records`.There 독립적으로 그룹화 될 수 있도록

;with x as (
    select *, case when lag(color) over(order by period) = color then 0 else 1 end as g 
    from @temp 
), 
y as (
    select *, sum(g) over(order by period) gg 
    from x 
), 
z as (
    select *, row_number() over(partition by gg order by period desc) rn 
    from y 
) 
select period, color, rate from z where rn = 1 
+0

안녕 딘, 네, 표준 16 일하고 있으므로, 확실히 작동합니다. 결과물은 원하는대로 출력됩니다. 나는 단계를 거치고 논리를 찾아 낼 것이다. 감사! –

+0

단계에 관해서는 - 예,보기 흉하게 보이지만 슬픈 사실은 창 기능을 작성할 수 없다는 것입니다. 따라서 여러 개의 CTE가 가능합니다. – dean