うーん。 . . 1 つの方法は、最後の値を取得することです。次に、その値と集計を持つ最後の行をすべて選択します:
select min(rownum), colA, colB from (select t.*, first_value(colA) over (partition by colB order by rownum desc) as last_colA from t ) t where rownum > all (select t2.rownum from t t2 where t2.colB = t.colB and t2.colA <> t.last_colA ) group by colA, colB;
プレ>または、集計なし:
select t.* from (select t.*, first_value(colA) over (partition by colB order by rownum desc) as last_colA, lag(colA) over (partition by colB order by rownum) as prev_clA from t ) t where rownum > all (select t2.rownum from t t2 where t2.colB = t.colB and t2.colA <> t.last_colA ) and (prev_colA is null or prev_colA <> colA);
プレ>しかし、SQL Server 2008 では、これをギャップ アンド アイランドの問題として扱いましょう:
select t.* from (select t.*, min(rownum) over (partition by colB, colA, (seqnum_b - seqnum_ab) ) as min_rownum_group, max(rownum) over (partition by colB, colA, (seqnum_b - seqnum_ab) ) as max_rownum_group from (select t.*, row_number() over (partition by colB order by rownum) as seqnum_b, row_number() over (partition by colB, colA order by rownum) as seqnum_ab, max(rownum) over (partition by colB order by rownum) as max_rownum from t ) t ) t where rownum = min_rownum_group and -- first row in the group defined by adjacent colA, colB max_rownum_group = max_rownum -- last group for each colB;
プレ>これは、行番号の違いを使用して各グループを識別します。データ内のグループおよび全体の最大 rownum を計算します。これらは最後のグループでも同じです。