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 之间
212648 181 18 之间
212648 500009 19 完
212648 5576 20  
212648 500960 21  
212648 5562 22  
212648 603659 23  

我想添加一个列,它将为“START”和“END”之间的行应用组名。例如:

ID_1 ID_2 SEQ 组 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 2之间
212648 500543 17 2 之间
212648 181 18 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 回答