手动指定Row_Number()的起始值

时间:2013-03-04 20:01:11

标签: sql sql-server row-number

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

我正在使用以下SQL查询

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

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

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

4 个答案:

答案 0 :(得分:55)

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

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

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

为避免混淆,我用NULL替换了常量值。在SQL Server中,我有观察,它指定了一个序列号而没有实际排序行 - 观察到的性能优势,但不是我见过的文档,所以我们不能依赖它

答案 1 :(得分: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)

答案 2 :(得分: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

答案 3 :(得分:0)

我遇到的情况是,我将一个层次结构导入到一个应用程序中,其中seq编号在每个层次级别中必须是唯一的,并且必须从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()以上(按类型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