首页 > 解决方案 > 我需要通过一个 sql 查询来实现以下逻辑

问题描述

我有一个带有 Tel_num 列的 master_table。Tel_num 是 11 位数据,如 02365785431。现在,当数字按顺序排列时,我必须将 min 作为 start_num,将 max 作为 end_num,并填充其关联的 line_value。如果出现以下情况:

Tel_num    Line_value
023158100001   V1
023158100002   V1
023158100003   V1
023158100004   V1 
023158115645   V2
023158111546   V2
023158111547   V2
023158111617   V2
023158121110   V3
023158121111   V3

然后我想要这样的数字

Start_NUM                    End_NUM         Line_Value
023158100001                023158100004        V1
023158115645                023158111547        V2
023158111617                023158111617        V2
023158121110                023158121111        V3

有人可以帮忙吗???

标签: sqloracle

解决方案


这是一种群岛问题。这是使用数字和行号之间的差异的解决方案

select line_value, min(tel_num), max(tel_num)
from (select t.*,
             ( cast(tel_num as number) -
               row_number() over (partition by line_value order by tel_num)
             ) as grp
      from t
     ) t
group by line_value, grp;

这是有效的,因为当值是连续的时,从值中减去递增序列会tel_num返回一个常数值。tel_num

是一个重新测试者。请注意,结果与问题中指定的结果不同,因为 023158115645 不应与任何其他数字组合。


推荐阅读