我想将ROW_NUMBER()
的开头定义为3258170
而不是1
。
我正在使用以下SQL查询
SELECT ROW_NUMBER() over(order by (select 3258170)) as 'idd'.
但是,上述查询无效。当我说不工作时,我的意思是它正在执行,但它不是从3258170
开始的。有人可以帮帮我吗?
我想指定行号的原因是我将Rows从一个表插入另一个表。在第一个表中,最后一个记录的行号为3258169
,当我插入新记录时,我希望它们具有3258170
的行号。
答案 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