हम्म । . . अंतिम मूल्य प्राप्त करने का एक तरीका है। फिर उस मान और समुच्चय के साथ सभी अंतिम पंक्तियाँ चुनें:
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;
यह पंक्ति संख्याओं के अंतर का उपयोग करके प्रत्येक समूह की पहचान करता है। यह समूह के लिए और डेटा में समग्र रूप से अधिकतम राउनम की गणना करता है। ये अंतिम समूह के लिए समान हैं।