手动指定Row_Number()的起始值

问题描述 投票:26回答:3

我想将ROW_NUMBER()的开头定义为3258170而不是1

我正在使用以下SQL查询

SELECT ROW_NUMBER() over(order by (select 3258170))  as 'idd'.

但是,上述查询无效。当我说不工作时,我的意思是它的执行,但它不是从3258170开始。有人能帮助我吗?

我想指定行号的原因是我将Rows从一个表插入另一个表。在第一个表中,最后一个记录的行号是3258169,当我插入新记录时,我希望它们具有来自3258170的行号。

sql sql-server row-number
3个回答
54
投票

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

select 3258170 - 1 + row_number() over (order by (select NULL)) as idd

order byrow_number()子句指定了用于订单的列。通过在那里指定一个常量,你只是说“一切都有相同的价值用于订购目的”。它没有任何东西,没有任何与选择的第一个值有关。

为避免混淆,我用NULL替换了常量值。在SQL Server中,我观察到这会分配一个序列号,而不会对行进行实际排序 - 观察到的性能优势,但不是我见过的文档,因此我们不能依赖它。


8
投票

我觉得这更容易

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函数等的复杂查询中使用。请参阅完整的序列文档here

© www.soinside.com 2019 - 2024. All rights reserved.