每3行生成行号

Pரத*_*ீப் 2 sql t-sql sql-server sql-server-2012

我想要每三行生成一个数字

CREATE TABLE #test(period INT)

INSERT INTO #test
VALUES      (602),(603),(604),(605),(606),(607),(608),(609)
Run Code Online (Sandbox Code Playgroud)

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

SELECT period,
       ( Row_number()OVER(ORDER BY period) - 1 ) / 3 + 1
FROM   #test 
Run Code Online (Sandbox Code Playgroud)

结果;

+--------+-----+
| period | seq |
+--------+-----+
|    602 |   1 |
|    603 |   1 |
|    604 |   1 |
|    605 |   2 |
|    606 |   2 |
|    607 |   2 |
|    608 |   3 |
|    609 |   3 |
+--------+-----+
Run Code Online (Sandbox Code Playgroud)

有没有其他方法可以用数学方法实现这一目标.期间之间不会有任何差距

Pet*_*r B 6

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

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

SELECT period,
       (period - @MIN_PERIOD) / 3 + 1 AS seq
FROM   #test 
Run Code Online (Sandbox Code Playgroud)

只要"期间之间没有任何差距"仍然存在,这就有效.

如果您需要WHERE主查询的子句,也将其应用于SELECT MIN()查询.只要WHERE不造成期间差距就可以工作.