我需要在表列上每4条记录增加+1,我尝试使用ROW_NUM(),但我的脏解决方法没有意义。
这就是我需要的:
Index PeriodID
1 1
1 2
1 3
1 4
2 5
2 6
2 7
2 8
PeriodID是表“Periods”的主键(聚簇索引),我听说过窗口函数LAG()和LEAD()但不确定我是否可以应用这个场景的概念,以下语法是我的尝试失败的诡计:
选择 row_number()over(orderid by orderid)/ 4 + 1, periodid 从期间
结果我得到:
Index PeriodID
1 1
1 2
1 3
2 4
2 5
2 6
2 7
3 8
我理解为什么我得到这个结果,但我想知道是否有一个内置的T-SQL函数可以帮助实现我需要的东西。
欢迎任何想法和建议
由于
答案 0 :(得分:2)
我不熟悉内置插件来解决这类问题,但是你可以用简单的数学方法来做(而且我确定有人可以收紧这个问题,只是第一次通过):
CREATE TABLE #t (PeriodID int PRIMARY KEY, ExpectedIndex int);
INSERT INTO #t VALUES (1, 1),(2, 1),(3, 1),(4, 1),(5, 2),(6, 2),(7, 2),(8, 2),(9, 3),(10, 3),(11, 3),(13, 3);
SELECT ((RowNum - ((RowNum - 1) % 4)) / 4) + 1 AS [Index], ExpectedIndex, PeriodID
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY PeriodID) AS RowNum, ExpectedIndex, PeriodID FROM #t
) AS tSub1
DROP TABLE #t;
编辑:我很好奇,这里是一个LAG版本(再次,毫无疑问没有优化),加上仅仅为了展示我的作品:
SELECT
(RowNum - IncrementalLag) / 4 AS ZeroBasedIndex
,((RowNum - IncrementalLag) / 4) + 1 AS [Index]
,ExpectedIndex
,PeriodID
FROM
(
SELECT
RowNum
,LAG(RowNum,1,0) OVER (ORDER BY RowNum) % 4 AS IncrementalLag
,ExpectedIndex
,PeriodID
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY PeriodID) AS RowNum, ExpectedIndex, PeriodID FROM #t
) AS tSub1
) AS tSub2;
答案 1 :(得分:2)
我相信@downwitch是对的,这是一个简单的数学问题,但我相信我会得到一个可能的答案:
select (row_number() over (order by primaryKeyColumnName) -1)/N from table
其中N是创建新分区的记录数
希望这个答案对其他人也有效