如何在SQL的Row_Number函数中跳过每第100个序号?
生成跳过每100倍数的自动递增序列
问题分析
你需要的序列是跳过所有100的倍数(100、200、300...),即序列为1-99、101-199、201-299……之前用rownum() over (partition by column_name)+1的方法会给所有行统一加1,无法实现精准跳过指定数字的效果,核心是需要根据行号的区间动态计算偏移量。
解决方案
使用row_number()(分区场景下必须用这个,而非全局的rownum)结合数学计算实现动态偏移,公式逻辑是:基础行号 + 每99行增加1的偏移量,刚好跳过每一个整百数。
完整SQL示例
SELECT your_partition_column, -- 生成自定义序列 row_number() OVER ( PARTITION BY your_partition_column ORDER BY your_sort_column -- 必须指定排序字段保证序列稳定 ) + FLOOR( (row_number() OVER ( PARTITION BY your_partition_column ORDER BY your_sort_column ) - 1) / 99 ) AS custom_sequence, -- 其他需要查询的字段 your_other_columns FROM your_table;
逻辑解释
- 基础行号生成:
row_number() OVER (PARTITION BY ... ORDER BY ...)在每个分区内生成从1开始的连续序号,保证序列的有序性和分区独立性。 - 偏移量计算:
FLOOR((rn - 1)/99)的作用是:- 当行号
rn在1-99区间时,(rn-1)/99结果为0-0.989,取整后为0,偏移量为0,序列就是1-99 - 当行号
rn在100-198区间时,(rn-1)/99结果为1-1.989,取整后为1,偏移量为1,序列变为100+1=101到198+1=199(跳过100) - 当行号
rn在199-297区间时,(rn-1)/99结果为2-2.989,取整后为2,偏移量为2,序列变为199+2=201到297+2=299(跳过200) - 以此类推,完美匹配你需要的序列规则。
- 当行号
验证示例
| 行号(rn) | 偏移量 | 最终序列值 |
|---|---|---|
| 1 | 0 | 1 |
| 99 | 0 | 99 |
| 100 | 1 | 101 |
| 198 | 1 | 199 |
| 199 | 2 | 201 |
| 297 | 2 | 299 |
内容的提问来源于stack exchange,提问作者abirami ramachandran
相关产品推荐
相关产品推荐

