6

テーブルに次のデータがあります

ID_1 ID_2 配列グループ
212648 601327 1   
212648 1805 2   
212648 500886 3   
212648 3405 4   
212648 501174 5   
212648 201245 6   
212648 500449 7   
212648 3804 8   
212648 501533 9   
212648 3989 10  
212648 500280 11 スタート
212648 175 12 間
212648 500395 13 終わり
212648 1817 14  
212648 500945 15 スタート
212648 183 16 間
212648 500543 17 BETWEEN
212648 181 18 間
212648 500009 19 終わり
212648 5576 20  
212648 500960 21  
212648 5562 22  
212648 603659 23  

「START」と「END」の間の行にグループ名を適用する列を追加したいと思います。例:

ID_1 ID_2 シーケンス グループ GROUP_SEQ
212648 601327 1       
212648 1805 2       
212648 500886 3       
212648 3405 4       
212648 501174 5       
212648 201245 6       
212648 500449 7       
212648 3804 8       
212648 501533 9       
212648 3989 10      
212648 500280 11 スタート 1
212648 175 12 1 の間
212648 500395 13 エンド 1
212648 1817 14      
212648 500945 15 スタート 2
212648 183 16 BETWEEN 2
212648 500543 17 BETWEEN 2
212648 181 18 BETWEEN 2
212648 500009 19 エンド 2
212648 5576 20      
212648 500960 21      
212648 5562 22      
212648 603659 23      

Oracle の分析関数 (RANK()、FIRST、LAST() など) で検索しましたが、解決策が見つかりませんでした。ご回答ありがとうございます。

4

1 に答える 1

5

まず、このクエリで結果が得られました。もう少し時間が費やされれば、おそらくよりクリーンな方法です。

SELECT id_1, id_2, seq, the_group

      ,CASE WHEN (start_count - end_count) > 0 OR (start_count = end_count AND the_group = 'END')
            THEN start_count
            ELSE NULL
       END AS group_seq

  FROM ( SELECT id_1, id_2, seq, the_group

               ,SUM( CASE WHEN the_group = 'START' THEN 1 ELSE 0 END )
                  OVER( PARTITION BY ID_1 ORDER BY id_1, SEQ ) AS start_count

               ,SUM( CASE WHEN the_group = 'END' THEN 1 ELSE 0 END )
                  OVER( PARTITION BY ID_1 ORDER BY id_1, SEQ ) AS end_count

           FROM myTable )

  ORDER BY id_1, seq
于 2012-08-01T17:54:46.480 に答える