使用ROW_NUMBER增加100?

时间:2012-12-14 23:13:17

标签: sql-server tsql

我有一个现有的表,其中行序列号在正常的软件操作中递增100。我需要执行一个大插入并维护这种增量方法。我以为我会使用ROW_NUMBER(),但我不知道它是否可以这样增加。

我很欣赏这个简单主题的帮助,但是,如果你想要更具体,请注意,行序列对于项目是唯一的,并且一些记录已经启动了序列。例如

Project  Category  Sequence
Proj1    Cat4      100
Proj1    Cat2      200
Proj2    Cat7      100
Proj2    Cat1      200
Proj3    Cat1      100

因此,如果这些已经存在且我正在插入新记录,我必须考虑已经为每个项目启动的序列。因此,如果我为Proj1插入行,则Sequence值必须为300,400,...

到目前为止,这是我的代码块:

WITH CTE (PROJECTNUM, COSTCATID, LINE) AS
(  SELECT PROJECTNUM, PACOSTCATID, ROW_NUMBER() OVER(PARTITION BY PROJECTNUM ORDER BY PACOSTCATID) 
      + (SELECT MAX(LNITMSEQ) FROM PROJECTTABLE WHERE PAPROJNUMBER = A.PROJECTNUM)
   FROM PROJECTSHORTLIST A, CATEGORYTABLE
   WHERE <stuff you don't care about>
)
INSERT INTO PROJECTTABLE
(PAPROJNUMBER, PACOSTCATID, LNITMSEQ)
SELECT PROJECTNUM, COSTCATID, LINE
FROM CTE;

您可以看到这将产生递增1的记录,而Proj1将产生301,302。

非常感谢你的脑力。

更新:我将补充一点,如果在首次插入行之后,在更新语句中可以更容易地完成此增量100,这是完全可以接受的。谢谢。

2 个答案:

答案 0 :(得分:1)

我正在回答我自己的问题,因为在询问它5分钟后,我想到了一个解决方案。我将“SELECT MAX()”部分的使用向下移动到INSERT语句,保留行号以供以后使用(我需要它用于其他列)。因此,在INSERT的SELECT部分​​中,我只需将ROW * 100添加到我的MAX序列号中。

WITH CTE (PROJECTNUM, COSTCATID, ROW) AS
(  SELECT PROJECTNUM, PACOSTCATID, ROW_NUMBER() OVER(PARTITION BY PROJECTNUM ORDER BY PACOSTCATID) 
   FROM PROJECTSHORTLIST A, CATEGORYTABLE
   WHERE <stuff you don't care about>
)
INSERT INTO PROJECTTABLE
(PAPROJNUMBER, PACOSTCATID, LNITMSEQ)
SELECT PROJECTNUM, COSTCATID, (ROW * 100) + (SELECT MAX(LNITMSEQ) FROM PROJECTTABLE WHERE PAPROJNUMBER = A.PROJECTNUM)
FROM CTE;

答案 1 :(得分:1)

如果我理解你的需要,我相信这将是最简单的一般模式:

SELECT
    ID, RowNumber, ((RowNumber + 99) / 100) * 100
FROM
    (
    SELECT
        ID, ROW_NUMBER() OVER (ORDER BY ID) AS RowNumber
    FROM
        Tbl
    ) AS X