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