2011-12-22 76 views
1

我有一組記錄。如何根據訂單對字段中的更改進行分組?

ID Value 
1 a 
2 b 
3 b 
4 b 
5 a 
6 a 
7 b 
8 b 

我想像他們那樣對他們進行分組。

MIN(ID) MAX(ID) Value 
1 1 a 
2 4 b 
5 6 a 
7 8 b 

我隱約知道甲骨文over()分析功能,看起來是正確的方向,但我不知道這是什麼問題被稱爲少得多如何解決這個問題。

回答

3

可能是一種更簡單的方法,但這可能有助於開始。我在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)  
+0

這種類型的問題是否有名稱? – reconbot 2011-12-23 22:27:31

+0

@ wizard我不知道任何。這對我來說是新的(和一個有趣的謎題)。儘管用零或者一個標記行並且總結分區組的想法似乎是一個很方便的技巧,但偶爾會出現。 – Glenn 2011-12-24 04:25:56

相關問題