【发布时间】:2017-02-09 13:09:42
【问题描述】:
我想为每三行生成一个数字
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 |
+--------+-----+
还有其他方法可以在数学上实现。期间不会有任何间隔
【问题讨论】:
-
就我而言,没有比这更好的方法了。毕竟,这就是 ROW_NUMBER 的设计目的,不是吗?为什么要使用另一种方法?
-
如果可以正常工作,为什么还要使用其他方法?你有什么理由想在数学上做更多的事情吗?
-
@Saypontigohe & @Tyron78 - 原始需求比这更复杂。我在另一个窗口函数的
partition by中使用该序列。因为Row_Number查询变得很慢 -
您的数据集中有最小周期数吗?
-
@scsimon - 不,它可以以任何数字开头.. 但总是数字
标签: sql sql-server tsql sql-server-2012