Hừ! . . Một phương pháp là lấy giá trị cuối cùng. Sau đó, chọn tất cả các hàng cuối cùng có giá trị đó và tổng hợp:
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;
Hoặc, không có sự tổng hợp:
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);
Nhưng trong SQL Server 2008, hãy coi đây là một vấn đề về khoảng trống và đảo:
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;
Điều này xác định từng nhóm bằng cách sử dụng sự khác biệt của số hàng. Nó tính toán khoảng thời gian tối đa cho nhóm và tổng thể trong dữ liệu. Đây là những điều tương tự cho nhóm cuối cùng.