Sql 手动指定行号()的起始值

Sql 手动指定行号()的起始值,sql,sql-server,row-number,Sql,Sql Server,Row Number,我想将行编号()的开头定义为3258170,而不是1 我正在使用以下SQL查询 SELECT ROW_NUMBER() over(order by (select 3258170)) as 'idd'. 但是,上述查询不起作用。当我说不工作时,我指的是它正在执行,但不是从3258170开始。有人能帮我吗 我想要指定行号的原因是我正在从一个表向另一个表插入行。在第一个表中,最后一条记录的行号是3258169,当我插入新记录时,我希望它们具有3258170中的行号,只需将值添加到行号()的结果中

我想将
行编号()的开头定义为
3258170
,而不是
1

我正在使用以下SQL查询

SELECT ROW_NUMBER() over(order by (select 3258170))  as 'idd'.
但是,上述查询不起作用。当我说不工作时,我指的是它正在执行,但不是从
3258170
开始。有人能帮我吗


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

中的行号,只需将值添加到
行号()的结果中即可:

行号()
order by
子句指定order by使用的列。通过在那里指定一个常量,您只是说“出于排序目的,所有东西都具有相同的值”。它与选择的第一个值无关

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

我觉得这样更容易

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)
有时

行号()可能不是最佳解决方案,尤其是在基础数据集中可能存在重复记录的情况下(用于连接查询等)。这可能导致返回的行比预期的多。您可以考虑创建一个序列,在某些情况下可以将其视为更干净的解决方案。 i、 e:


缺点是,序列可能难以用于具有不同窗口函数等的复杂查询。请参阅完整的序列文档。

我曾经遇到过这样一种情况:我将一个层次结构导入到一个应用程序中,其中每个层次结构中的序号必须是唯一的,并且从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+行号()超过(按级别划分,按类型描述,[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

我不确定这样做是否可行,但我肯定这是一个可怕的想法。你到底想做什么?SQL Server有自动递增的整数列,不是吗?你不能添加一个自动递增的主键来保持正确的ID吗?是的,我可以。只是想看看是否有其他方法。@John-你需要这样做吗了解ROW_NUMBER()是什么,并且您不能给它赋值。您只能向它添加值。从Oracle文档中可以看出:“ROW_NUMBER是一个分析函数。它为应用它的每一行(分区中的每一行或查询返回的每一行)指定一个唯一的数字。”,在order_by_子句中指定的有序行序列中,从1开始。“有关MySQL,请参阅OMG Ponies的答案:
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

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