手动指定Row_Number()的起始值

41
我希望将ROW_NUMBER()的起始值定义为3258170而不是1
我正在使用以下SQL查询。
SELECT ROW_NUMBER() over(order by (select 3258170))  as 'idd'.

然而,上述查询不起作用。当我说不起作用时,我的意思是它正在执行,但它没有从3258170开始。有人能帮帮我吗?
我想指定行号的原因是我正在将一张表中的行插入到另一张表中。在第一张表中,最后一条记录的行号是3258169,当我插入新记录时,我希望它们的行号从3258170开始。

我不确定这样的事情是否可能,但我确信这是一个可怕的想法。你实际上想要实现什么?SQL Server有自增整数列,不是吗? - user554546
1
你不能添加一个自增的主键来保持正确的ID吗? - Matt Busche
是的,我可以做到。只是想看看是否有其他方法。 - Huzaifa
5个回答

95

只需将值添加到row_number()的结果中:

select 3258170 - 1 + row_number() over (order by (select NULL)) as idd
row_number()order by子句指定了用于排序的列。通过在那里指定一个常量,您只是说“所有东西在排序目的上具有相同的值”。它与选择的第一个值没有任何关系。
为避免混淆,我将常量值替换为NULL。在SQL Server中,我观察到这会分配一个连续的数字,而不实际对行进行排序 - 这是一种观察到的性能优势,但我没有看到过文档,因此我们不能依赖它。

@John - 你需要理解ROW_NUMBER()是什么,以及你不能给它分配值。你只能将其增加。来自Oracle文档:"ROW_NUMBER是一种分析函数。它为应用于其上的每一行(无论是在分区中的每一行还是由查询返回的每一行)分配一个唯一的数字,在order_by_clause中指定的行有序序列中从1开始"。 - Art
对于MySQL,请参见OMG Ponies在以下链接中的答案:https://dev59.com/enI-5IYBdhLWcg3wW3Cp - Oliver Zendel

12

我觉得这更容易了。

ROW_NUMBER() OVER(ORDER BY Field) - 1 AS FieldAlias (To start from 0)
ROW_NUMBER() OVER(ORDER BY Field) + 3258169 AS FieldAlias (To start from 3258170)

1
有时候,ROW_NUMBER()可能不是最好的解决方案,特别是当底层数据集中存在重复记录时(例如JOIN查询等)。这可能导致返回比预期更多的行。您可以考虑创建一个SEQUENCE,在某些情况下,这可能被认为是一种更清晰的解决方案。 例如:
CREATE SEQUENCE myRowNumberId  
    START WITH 1  
    INCREMENT BY 1 
GO  

SELECT NEXT VALUE FOR myRowNumberId  AS 'idd' -- your query
GO

DROP SEQUENCE myRowNumberId; -- just to clean-up after ourselves
GO

序列的缺点是,在使用DISTINCT、WINDOW函数等复杂查询时可能会很难使用。请参阅完整的序列文档这里

0

我曾经遇到这样一种情况,我需要将一个分层结构导入到一个应用程序中,其中每个分层级别内的序列号必须是唯一的,并且从110开始(为了方便后续手动插入)。之前的数据看起来像这样...

Level Prod        Type  Component      Quantity     Seq
1   P00210005       R   NZ1500         57.90000000  120
1   P00210005       C   P00210005M     1.00000000   120
2   P00210005M      R   M/C Operation   20.00000000 110
2   P00210005M      C   P00210006      1.00000000   110
2   P00210005M      C   P00210007      1.00000000   110


我希望使用row_number()函数生成新的序列号,但加上10然后乘以10并没有像预期那样实现。为了强制执行算术函数的顺序,您必须将整个row_number()和partition子句括在括号中。您只能对row_number()执行简单的加减运算。
因此,我对这个问题的解决方案是 ,10*(10+row_number() over (partition by Level order by Type desc, [Seq] asc)) [NewSeq]
请注意括号的位置,以便允许在加法之后进行乘法运算。
Level Prod        Type  Component      Quantity     [Seq] [NewSeq]
1   P00210005       R   NZ1500        57.90000000   120   110
1   P00210005       C   P00210005M    1.00000000    120   120
2   P00210005M      R   M/C Operation 20.00000000   110   110
2   P00210005M      C   P00210006     1.00000000    110   120
2   P00210005M      C   P00210007     1.00000000    110   130

0

ROW_NUMBER() OVER(ORDER BY Field) - 1 AS FieldAlias (从0开始) ROW_NUMBER() OVER(ORDER BY Field) - 2862718 AS FieldAlias (从2862718开始)

row_number()的order by子句指定了用于排序的列。通过在那里指定一个常量,您只是在说“所有东西在排序目的上具有相同的值”。它与选择的第一个值没有任何关系。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接