列上每N个记录的值增加值

时间:2014-03-14 19:54:39

标签: sql-server-2012 window-functions

我需要在表列上每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函数可以帮助实现我需要的东西。

欢迎任何想法和建议

由于

2 个答案:

答案 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是创建新分区的记录数

希望这个答案对其他人也有效