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)
有没有其他方法可以用数学方法实现这一目标.期间之间不会有任何差距
数学或算术方法可以是使用周期数字本身:
-- 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
不造成期间差距就可以工作.