You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL如何实现单列连续数值转换为区间范围(含缺值场景)

连续数值转区间的实现方法

核心逻辑

不管用什么工具,核心思路都是给序列中的连续数值分配同一个分组ID,出现断层时分组ID+1,之后按分组ID聚合取每组的最小值和最大值,拼接成区间即可。
注意:所有实现均要求先对目标数值列做升序排序,否则分组逻辑会失效。

1. SQL 实现

适用于数据库表操作,用标准窗口函数即可实现:

WITH numbered AS (
    -- 计算数值和行号的差值,差值相同的属于同一连续组
    SELECT 
        num,
        num - ROW_NUMBER() OVER (ORDER BY num) AS group_id
    FROM your_table
)
SELECT 
    MIN(num) || '-' || MAX(num) AS continuous_interval
FROM numbered
GROUP BY group_id
ORDER BY MIN(num);

如果数值序列存在重复值,把ROW_NUMBER()换成DENSE_RANK()即可兼容。

2. Excel 实现

适用于本地表格处理:
假设目标数值列在A列,从A2开始已排序:

  • B2输入0作为第一个分组ID
  • B3输入公式=IF(A3=A2+1, B2, B2+1),下拉填充所有行
  • 按B列分组,每组取A列的最小值和最大值拼接即为对应区间
    如果使用Excel 365及以上版本,可直接用数组公式一键生成所有区间:
=TEXTJOIN("、",TRUE,UNIQUE(FILTER(IF(B:B=SEQUENCE(,MAX(B:B)+1),MINIFS(A:A,B:B,SEQUENCE(,MAX(B:B)+1))&"-"&MAXIFS(A:A,B:B,SEQUENCE(,MAX(B:B)+1)),""),FALSE))

3. Python 实现

适用于pandas数据表处理场景:

import pandas as pd

# df为目标数据表,num为待处理的数值列名
df = df.sort_values('num').reset_index(drop=True)
# 生成分组ID
df['group_id'] = df['num'] - df.index
# 分组聚合生成区间
interval_df = df.groupby('group_id')['num'].agg(['min', 'max'])
interval_df['interval'] = interval_df['min'].astype(str) + '-' + interval_df['max'].astype(str)
# 输出区间列表
intervals = interval_df['interval'].tolist()

内容的提问来源于stack exchange,提问作者MTurowski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:57:04