sql - 查找数据中的序列并按其分组

标签 sql oracle gaps-and-islands

我的 Temp_table 的 Phone_number 列中的数据如下所示

1234560200
1234560201
1234560202
2264540300
2264540301
2264540302
2264540303
2264540304
2264540305
2264540306

我希望它找到最后 4 位数字的序列,并找到它的序列的第一个和最后一个数字。例如。 前 3 行的顺序为 0200, 0201, 0202,因此 First = 0200,Last = 0202

此查询的最终输出应该是

First  Last

0200   0202
0300   0306 

我尝试了以下查询,但不确定这种方法。

WITH get_nxt_range AS 
(
  select substr(a.PHONE_NUMBER,7,4) range1, 
  LEAD(substr(a.PHONE_NUMBER,7,4)) OVER (ORDER BY a.PHONE_NUMBER ) nxt_range
  from Temp_table a
)
SELECT range1,nxt_range FROM get_nxt_range
WHERE nxt_range = range1 +1
ORDER BY range1

最佳答案

获取序列的一种方法是使用行号差异方法。这也适用于您的情况:

select substr(phone_number, 1, 6),
       min(substr(phone_number, 7, 4)), max(substr(phone_number, 7, 4))
from (select t.*,
             (row_number() over (order by phone_number) -
              row_number() over (partition by substr(phone_number, 1, 6) order by phone_number)
             ) as grp
      from temp_table t
     ) t
group by substr(phone_number, 1, 6), grp;

关于sql - 查找数据中的序列并按其分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35505309/

相关文章:

php - Codeigniter 和 oracle 未定义常量 : OCI_COMMIT_ON_SUCCESS

sql - 查找表中缺失的序列

sql - 如何识别 SQL 中的连续日期组?

SQL面试题

SQL 计数连续行

php - 如何构建一个查询,对切换发件人和收件人的交易余额进行求和

sql - Oracle SQL "SELECT DATE from DATETIME field "

MySQL - 在相关子查询中限制聚合数据时嵌套子查询的替代方法

sql - 如何对下面的更新sql进行SQL调优

每天按实例汇总的 SQL 查询