Oracle数据库19c企业版
我有一个表,上面有各种代码,如下所示。代码前面有一个字母,后面跟着一个数字。有些是按顺序排列的,有些是单独的或随机的独立数字。
A1,A2,A3,A4,A5,A8,A9,A10,A11,A12,B3,B5,B7,B8,B9,B110,B111,B112,C1,C2,C3,C4,C5,C6,C7,C8
我希望按如下所示的范围显示它们。下面是指向架构和数据的链接:SQL小提琴
预期输出:
A1-A5
A8-A12
B3
B5
B7-B9
B110-B112
C1-C8
我尝试了http://lalitkumarb.wordpress.com/2015/07/22/find-range-of-consecutive-values-in-a-sequence-of-numbers-or-dates/这样的解决方案,但对我不起作用,因为我在数字前加了字母前缀。
2条答案
按热度按时间gudnpqoy1#
在Oracle 12中,可以将字符串拆分为前缀和后缀,然后使用
MATCH_RECOGNIZE
高效地执行逐行模式匹配:或者,如果要使用分析函数,然后进行聚合,则:
对于示例数据,这两个函数都输出:
| 范围|
| - ------|
| A1至A5|
| A8至A12|
| B3-B3|
| B5-B5|
| B7-B9|
| 小行星110 - 112|
| 碳1-碳8|
fiddle
nszi6y052#
也可以使用标准SQL解决: