我想每三行生成一个数字
CREATE TABLE #test(period INT) INSERT INTO #test VALUES (602),(603),(604),(605),(606),(607),(608),(609)
我知道我们可以使用row_number窗口函数或while循环或cursor
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 | +--------+-----+
还有其他方法可以在 数学 上实现这一目标。两段之间没有任何间隙
一种数学或算术方法可以是使用周期数本身:
-- 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不引起时间间隔就可以正常工作。
WHERE
SELECT MIN()