我有一个现有的表,其中行序列号在正常的软件操作中递增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,这是完全可以接受的。谢谢。
答案 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