36

我想定义ROW_NUMBER()as3258170而不是1.

我正在使用以下 SQL 查询

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

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

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

4

4 回答 4

80

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

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

order by子句row_number()指定用于排序的列。通过在此处指定一个常量,您只是在说“出于排序目的,所有内容都具有相同的值”。它与选择的第一个值没有任何关系。

为避免混淆,我将常量值替换为 NULL。在 SQL Server 中,我观察到这会分配一个序列号而不实际对行进行排序——这是一种观察到的性能优势,但不是我见过的记录,所以我们不能依赖它。

于 2013-03-04T20:05:31.337 回答
10

我觉得这更容易

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)
于 2016-08-19T09:28:37.193 回答
1

有时....

ROW_NUMBER() 可能不是最佳解决方案,尤其是当基础数据集中可能存在重复记录时(对于 JOIN 查询等)。这可能会导致返回的行数超出预期。您可以考虑创建一个 SEQUENCE,在某些情况下它可以被认为是更清洁的解决方案。IE:

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

于 2017-12-27T21:07:16.290 回答
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() over (按级别顺序按类型 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
于 2020-02-07T12:02:30.153 回答