可能是一種更簡單的方法,但這可能有助於開始。我在Postgres上運行它,但應該在Oracle上運行(也許只需稍作調整)。最內層的查詢將每個行的前一個值。我們可以使用它來檢測分組更改(當值不等於先前的值時)。每次有團體變更時,我們都用「1」來標記。總結這些組變化,我們現在有一個組ID,每當價值發生變化時就會增加。然後我們可以按功能執行我們的正常組。
create table x(id int, value varchar(1));
insert into x values(1, 'a');
insert into x values(2, 'b');
insert into x values(3, 'b');
insert into x values(4, 'b');
insert into x values(5, 'a');
insert into x values(6, 'a');
insert into x values(7, 'b');
insert into x values(8, 'b');
SELECT MIN(id), MAX(id), value
FROM (SELECT id
,value
,previous_value
,SUM(CASE WHEN value = previous_value THEN 0 ELSE 1 END) OVER(ORDER BY id) AS group_id
FROM (SELECT id
,value
,COALESCE(LAG(value) OVER(ORDER BY id), value) previous_value
FROM x
ORDER BY id
) y
) z
GROUP BY group_id, value
ORDER BY 1, 2;
min | max | value
-----+-----+-------
1 | 1 | a
2 | 4 | b
5 | 6 | a
7 | 8 | b
(4 rows)
這種類型的問題是否有名稱? – reconbot 2011-12-23 22:27:31
@ wizard我不知道任何。這對我來說是新的(和一個有趣的謎題)。儘管用零或者一個標記行並且總結分區組的想法似乎是一個很方便的技巧,但偶爾會出現。 – Glenn 2011-12-24 04:25:56