简体   繁体   English

Oracle SQL根据列值将连续数字分配给子集

[英]Oracle SQL assign consecutive numbers to a subset based on column values

I have the following data on table 我在桌子上有以下数据

ID_1    ID_2    SEQ GROUP
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  START
212648  175     12  BETWEEN
212648  500395  13  END
212648  1817    14  
212648  500945  15  START
212648  183     16  BETWEEN
212648  500543  17  BETWEEN
212648  181     18  BETWEEN
212648  500009  19  END
212648  5576    20  
212648  500960  21  
212648  5562    22  
212648  603659  23

I would like to add a column that will apply a group name for the rows between 'START" and 'END'. For example: 我想添加一个列,为“START”和“END”之间的行应用组名。例如:

ID_1    ID_2    SEQ GROUP   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  START    1
212648  175     12  BETWEEN  1
212648  500395  13  END      1
212648  1817    14      
212648  500945  15  START    2
212648  183     16  BETWEEN  2
212648  500543  17  BETWEEN  2
212648  181     18  BETWEEN  2
212648  500009  19  END      2
212648  5576    20      
212648  500960  21      
212648  5562    22      
212648  603659  23

I searched in the analytical functions of Oracle (RANK(), FIRST, LAST() etc.) but I could not find a solution. 我搜索了Oracle的分析函数(RANK(),FIRST,LAST()等),但我找不到解决方案。 Thanks in advance for any responses. 提前感谢您的回复。

Off the top, this query got the result. 在顶部,此查询得到了结果。 Probably a cleaner way if a bit more time is spent on it. 如果花费更多的时间,可能会更简洁。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM