Increment value on column every N records on table

别等时光非礼了梦想. 提交于 2021-02-10 18:32:28

问题


I need to increment +1 every 4 records over a table column, I've tried to use ROW_NUM() but my dirty workaround does not make sense.

This is what I need:

Index PeriodID
1       1
1       2
1       3
1       4
2       5
2       6
2       7
2       8

PeriodID is the primary key (clustered index) for table "Periods", I've heard about window functions LAG() and LEAD() but not sure if I can apply the concept for this scenario, the following syntax is my failed dirty trick attempt:

select row_number() over (order by periodid)/4+1, periodid from periods

Result I get:

Index PeriodID
1       1
1       2
1       3
2       4
2       5
2       6
2       7
3       8

I understand why I'm getting this result but I would like to know if there is a built in T-SQL function that can help to achieve what I need.

Any thoughts, suggestions are welcome

Thanks


回答1:


I am not that familiar with built-ins to solve this kind of problem, but you can do it with plain math (and I'm sure someone could tighten this up, just a first pass):

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;

EDIT: I was curious, here's a LAG version (again, no doubt not optimized), plus subqueried out just to Show My Work:

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;



回答2:


I believe @downwitch is right, is a simple math problem, however I believe I become with a possible answer:

select (row_number() over (order by primaryKeyColumnName) -1)/N from table

where N is the number of records to create a new partition

Hope this answer is valid for other people too



来源:https://stackoverflow.com/questions/22414541/increment-value-on-column-every-n-records-on-table

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!