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

SQL Server中如何根据RankFrom与RankTo生成连续行结果?

解法:将Rank区间拆分为逐行数据

针对你在SQL Server中的这个需求,我提供三种常用的实现方式,你可以根据自己的SQL Server版本和场景选择:

1. 递归CTE(兼容性最好,支持所有SQL Server版本)

递归CTE是最通用的方法,不需要依赖任何系统表或新特性,思路是先获取原表的每一行,然后递归生成从RankFrom到RankTo的每个数值:

WITH RankCTE AS (
    -- 锚点查询:获取原表的初始行,同时把RankFrom转为数值类型
    SELECT 
        Code,
        Name,
        CAST(RankFrom AS INT) AS CurrentRank,
        CAST(RankTo AS INT) AS MaxRank
    FROM Ranking
    UNION ALL
    -- 递归查询:每次生成下一个Rank值,直到达到MaxRank
    SELECT 
        Code,
        Name,
        CurrentRank + 1,
        MaxRank
    FROM RankCTE
    WHERE CurrentRank < MaxRank
)
SELECT Code, Name, CurrentRank AS Rank
FROM RankCTE
ORDER BY Code, CurrentRank;

2. 利用系统表生成数字序列(适合不喜欢递归的场景)

SQL Server自带的master.dbo.spt_values表包含了连续的数字,我们可以用它来生成所需的数字范围,再和原表关联:

SELECT 
    r.Code,
    r.Name,
    v.number AS Rank
FROM Ranking r
JOIN master.dbo.spt_values v 
    ON v.number BETWEEN CAST(r.RankFrom AS INT) AND CAST(r.RankTo AS INT)
WHERE v.type = 'P' -- 筛选出正整数序列
ORDER BY r.Code, v.number;

注意:spt_values的number范围默认是0到2047,如果你的Rank区间超过这个范围,需要自己创建一个更大的数字表。

3. SQL Server 2022+ 专属:GENERATE_SERIES函数

如果你的SQL Server版本是2022或更高,直接用GENERATE_SERIES函数可以更简洁地实现:

SELECT 
    r.Code,
    r.Name,
    s.value AS Rank
FROM Ranking r
CROSS APPLY GENERATE_SERIES(CAST(r.RankFrom AS INT), CAST(r.RankTo AS INT)) s
ORDER BY r.Code, s.value;

测试结果

针对你插入的测试数据:

INSERT INTO [Ranking]([Code],[Name],[RankFrom],[RankTo])VALUES('01','Hisanth','105','110')

以上三种方法都会返回6行结果:

CodeNameRank
01Hisanth105
01Hisanth106
01Hisanth107
01Hisanth108
01Hisanth109
01Hisanth110

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:44:11