小编典典

每3行产生行号

sql

我想每三行生成一个数字

CREATE TABLE #test(period INT)

INSERT INTO #test
VALUES      (602),(603),(604),(605),(606),(607),(608),(609)

我知道我们可以使用row_number窗口函数或while循环或cursor

SELECT period,
       ( Row_number()OVER(ORDER BY period) - 1 ) / 3 + 1
FROM   #test

结果;

+--------+-----+
| period | seq |
+--------+-----+
|    602 |   1 |
|    603 |   1 |
|    604 |   1 |
|    605 |   2 |
|    606 |   2 |
|    607 |   2 |
|    608 |   3 |
|    609 |   3 |
+--------+-----+

还有其他方法可以在 数学 上实现这一目标。两段之间没有任何间隙


阅读 309

收藏
2021-04-28

共1个答案

小编典典

一种数学或算术方法可以是使用周期数本身:

-- table init here
DECLARE @MIN_PERIOD INT = (SELECT MIN(period) FROM #test)

SELECT period,
       (period - @MIN_PERIOD) / 3 + 1 AS seq
FROM   #test

只要“两个期间之间没有任何间隔”仍然适用,该方法就起作用。

如果您需要WHERE主查询中的子句,请将其应用于SELECT MIN()查询。只要WHERE不引起时间间隔就可以正常工作。

2021-04-28