Sql server 2012 表中每N条记录列上的增量值

Sql server 2012 表中每N条记录列上的增量值,sql-server-2012,window-functions,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(),但不确定是否可以将此概念应用于此场景,以下语法是我失败的肮脏技巧尝试: 挑选 (按周期ID排序)/

我需要在一个表列上每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(),但不确定是否可以将此概念应用于此场景,以下语法是我失败的肮脏技巧尝试:

挑选 (按周期ID排序)/4+1上的行号(), 周期性 从时期

结果我得到:

Index PeriodID
1       1
1       2
1       3
2       4
2       5
2       6
2       7
3       8
我理解为什么我会得到这个结果,但我想知道是否有一个内置的T-SQL函数可以帮助实现我所需要的

欢迎有任何想法和建议


谢谢

我不太熟悉解决这类问题的内置程序,但你可以用简单的数学来解决它(我相信有人可以把它收紧,只是第一步):

编辑:我很好奇,这里有一个滞后版本(同样,毫无疑问没有优化),加上子查询,只是为了显示我的工作:

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;

我对解决这类问题的内置程序不太熟悉,但你可以用简单的数学来解决(我相信有人可以把它收紧,只需第一步):

编辑:我很好奇,这里有一个滞后版本(同样,毫无疑问没有优化),加上子查询,只是为了显示我的工作:

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;

我相信@downwitch是对的,这是一个简单的数学问题,但我相信我会得到一个可能的答案:

select (row_number() over (order by primaryKeyColumnName) -1)/N from table
其中N是要创建新分区的记录数


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

我相信@downwitch是对的,这是一个简单的数学问题,但是我相信我有一个可能的答案:

select (row_number() over (order by primaryKeyColumnName) -1)/N from table
其中N是要创建新分区的记录数


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

我的直觉是“简单的数学”可能是一个很好的答案。我认为您不需要转换(INT,…)。我喜欢你将你期望的结果构建到你的样本数据中。我的直觉是“简单的数学”可能是一个很好的答案。我认为您不需要转换(INT,…)。我喜欢你将你期望的结果构建到你的样本数据中。这几乎就是你的“肮脏伎俩”的修正版本。将+1添加到你的计算中,它就会成为你想要的1基数。这是更好的简单数学。这几乎就是你的“肮脏伎俩”的修正版本将+1添加到您的计算中,它将成为所需的1基数。这是一个更好的简单数学。NTIE几乎可以做到这一点,但在不均匀组中,它将平衡它们,而不是在最后一组中保留尽可能小的数字。NTIE几乎可以做到这一点,但在不均匀组中,它将平衡它们,而不是在最后一组中保留尽可能小的数字。