[英]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.