2017-02-14 4 views
2

順序を尊重し、最後の値を選択する私は、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の最初と最後のノーである必要がありますいくつかの論理をグループを決定する.PLUS 1のサンプルデータ – TheGameiswar

+0

のように常に最初の3つの日付順に1つのグループに落ちて、他のグループに残ります – TheGameiswar

+0

DDLをありがとう、しかし必要がない限りplsは(MAX)データ型を使用しません。 – dean

答えて

0

私はあなたが原因で窓関数の、SQL Serverのいくつかの新しいバージョンを使用している願っています。ここで

は、ソリューションです:あなたは..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

こんにちはDean、はい、標準16で動作しますので、間違いなく動作します。 出力は正確にどのように見えますか。私はステップを踏んで作業し、論理を理解します。ありがとう! –

+0

手順については - はい、それは醜いように見えますが、悲しい事実はウィンドウ関数を作成できないことで、複数のCTEです。 – dean

関連する問題