gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:14:02 27 4
gpt4 key购买 nike

我在表上有以下数据

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 序列组 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 2 之间的 16
212648 500543 2 之间的 17
212648 181 2 之间的 18
212648 500009 19 完 2
212648 5576 20
212648 500960 21
212648 5562 22
212648 603659 23

我搜索了 Oracle 的分析函数(RANK()、FIRST、LAST() 等),但找不到解决方案。
提前感谢您的任何答复。

最佳答案

最重要的是,这个查询得到了结果。如果花更多时间在上面,可能是一种更清洁的方法。

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

关于sql - Oracle SQL 根据列值将连续数字分配给一个子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11764064/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com