如何查找数据表列中的最长连续区间?
查找数据表列中最长连续区间的方法
假设你的数据表(比如叫your_table)有一列ID,存储的数值像你示例里的1,2,3,4,5,6,10,11,12,要找出最长的连续数值区间,核心思路是用窗口函数识别连续分组,再计算每组长度找出最大值。我给你分步说明:
步骤1:标记连续区间的分界点
先用LAG()函数获取当前ID的前一个ID,计算两者的差值。如果差值大于1,说明这里是新连续区间的起点:
WITH cte_diff AS ( SELECT ID, -- 第一个ID没有前值,默认和自己相等,差值为0 CASE WHEN ID - LAG(ID, 1, ID) OVER (ORDER BY ID) > 1 THEN 1 ELSE 0 END AS is_new_group FROM your_table )
步骤2:给每个连续区间分配分组ID
通过累计求和SUM(),把分界点的标记累加,这样同一个连续区间的ID会得到相同的分组ID:
, cte_grouped AS ( SELECT ID, SUM(is_new_group) OVER (ORDER BY ID) AS group_id FROM cte_diff )
步骤3:计算每个区间的长度并找出最长的
对每个分组ID,计算区间的起始、结束值和长度,最后按长度倒序取第一个结果:
SELECT MIN(ID) AS 区间起始值, MAX(ID) AS 区间结束值, MAX(ID) - MIN(ID) + 1 AS 区间长度 FROM cte_grouped GROUP BY group_id ORDER BY 区间长度 DESC LIMIT 1;
针对你示例数据的执行结果
你的示例ID列是1,2,3,4,5,6,10,11,12,执行上面的SQL后会得到:
区间起始值:1,区间结束值:6,区间长度:6
这就是最长的连续区间啦。如果有多个长度相同的最长区间,LIMIT 1只会返回一个,要是想返回所有,可以去掉LIMIT或者用窗口函数筛选长度等于最大值的行。
内容的提问来源于stack exchange,提问作者user9773216
相关产品推荐
相关产品推荐

