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

如何使用SQL实现数据范围扁平化处理

SQL实现数据范围扁平化操作指导

原始数据为包含区间范围的记录(每条记录有起始值和结束值),目标是将每个区间拆分为逐行的单个值,以下是两种通用实现方案:


方法1:递归CTE(适配MySQL 8+、PostgreSQL、SQL Server等主流数据库)

假设原始表名为range_data,结构包含id(记录标识)、start_val(区间起始值)、end_val(区间结束值):

-- 示例表结构与测试数据
CREATE TABLE range_data (
    id INT,
    start_val INT,
    end_val INT
);

INSERT INTO range_data VALUES
(1, 1, 3),
(2, 5, 7);

用递归CTE拆分区间:

WITH recursive_range AS (
    -- 锚点查询:取出每个区间的起始值
    SELECT id, start_val AS flat_val, end_val
    FROM range_data
    UNION ALL
    -- 递归逻辑:逐次递增1,直到达到区间结束值
    SELECT id, flat_val + 1, end_val
    FROM recursive_range
    WHERE flat_val < end_val
)
-- 输出最终扁平化结果
SELECT id, flat_val
FROM recursive_range
ORDER BY id, flat_val;

方法2:数字辅助表(兼容性更强,适配所有数据库)

先创建一张包含连续数字的辅助表,数字范围需覆盖你的最大区间长度:

-- 创建数字表(以MySQL为例,其他数据库语法类似)
CREATE TABLE numbers (num INT PRIMARY KEY AUTO_INCREMENT);
-- 插入0-1000的连续数字(可按需调整范围)
INSERT INTO numbers VALUES ();
INSERT INTO numbers SELECT NULL FROM numbers n1, numbers n2, numbers n3 LIMIT 1000;

通过关联辅助表拆分区间:

SELECT 
    rd.id,
    rd.start_val + n.num AS flat_val
FROM range_data rd
JOIN numbers n 
ON rd.start_val + n.num <= rd.end_val
ORDER BY rd.id, flat_val;

注意事项

  • 若处理的是日期/小数这类非整数区间,需调整增量逻辑:日期用DATE_ADD/DATE_TRUNC,小数按精度设置步长(如0.1)。
  • 数字辅助表的范围要确保覆盖业务中最长的区间,避免遗漏数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:45:41