You need to enable JavaScript to run this app. SQL使用Row_Number生成行号时跳过指定数值的问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

SQL使用Row_Number生成行号时跳过指定数值的问题咨询

SQL生成非连续自定义行号的代码调整方案

要实现跳过指定行号的需求,只需要在原有连续行号的基础上,叠加对应跳过数量的偏移量即可。以你示例中要跳过3、4两个行号,最终得到1、2、5、6、7的结果为例,调整后的代码如下:

SELECT 
    CASE 
       WHEN clean_client_nm = 'Total Opportunities' 
          THEN 0 
          ELSE 
            CASE 
                -- 原行号大于等于3时,加2个偏移量跳过3、4
                WHEN origin_row_num >= 3 THEN origin_row_num + 2
                ELSE origin_row_num 
            END
    END AS row_id,
    prod,
    client_nm,
    clean_ft_ee,
    ISNULL(Med, ''),
    ISNULL(Stop, ''),
    ISNULL(Den, ''),
    ISNULL(VIS, ''),
    ISNULL(Life, ''),
    ISNULL(STD, ''),
    ISNULL(LTD, ''),
    ISNULL(Worksite, ''),
    client_sic
FROM 
    (
        -- 预先计算原始连续行号,避免重复调用窗口函数
        SELECT 
            *,
            ROW_NUMBER() OVER (ORDER BY clean_ft_ee DESC) AS origin_row_num
        FROM (
            SELECT * FROM TOTAL
            UNION ALL
            SELECT * FROM BASE
        ) AS X
    ) AS T
ORDER BY 
    CASE 
       WHEN clean_client_nm = 'Total Opportunities' 
          THEN 0 
          ELSE 1 
    END,
    clean_ft_ee DESC, client_nm 

如果需要跳过的数值比较零散,可以用更通用的写法,只需要维护跳过的数值列表即可,不需要手动计算偏移量:

SELECT 
    CASE 
       WHEN clean_client_nm = 'Total Opportunities' 
          THEN 0 
          ELSE origin_row_num + (
              -- 统计小于等于当前行号的跳过数值数量,自动得到偏移量
              SELECT COUNT(*) 
              FROM (VALUES(3),(4)) AS skip_list(skip_num) 
              WHERE skip_num <= origin_row_num
          )
    END AS row_id,
    -- 其余字段和排序逻辑和上文一致,无需改动
    prod,
    client_nm,
    clean_ft_ee,
    ISNULL(Med, ''),
    ISNULL(Stop, ''),
    ISNULL(Den, ''),
    ISNULL(VIS, ''),
    ISNULL(Life, ''),
    ISNULL(STD, ''),
    ISNULL(LTD, ''),
    ISNULL(Worksite, ''),
    client_sic
FROM 
    (
        SELECT 
            *,
            ROW_NUMBER() OVER (ORDER BY clean_ft_ee DESC) AS origin_row_num
        FROM (
            SELECT * FROM TOTAL
            UNION ALL
            SELECT * FROM BASE
        ) AS X
    ) AS T
ORDER BY 
    CASE 
       WHEN clean_client_nm = 'Total Opportunities' 
          THEN 0 
          ELSE 1 
    END,
    clean_ft_ee DESC, client_nm 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 11:15:11