在SQL查询中生成行序列号

Nom*_*mad 7 sql-server

我有一个客户交易表.我需要创建一个包含序列号伪列的查询.序列号应自动重置,并在客户ID更改时从1开始重新开始.

现在,我熟悉SQL中的row_number()函数.这并不能完全解决我的问题,因为据我所知,如果行的顺序发生变化,序列号将不会被重置.

我想在单个查询(SQL Server)中执行此操作,而无需通过任何临时表使用等.

有任何想法吗?

提前致谢

Avi*_*hek 12

有时我们可能不希望在结果集上应用排序来添加序列号.但是如果我们要使用ROW_NUMBER()那么我们必须有一个ORDER BY条款.因此,为此我们可以简单地应用一些技巧来避免对结果集进行任何排序.

SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS ItemNo, ItemName FROM ItemMastetr
Run Code Online (Sandbox Code Playgroud)

为此,我们不需要在结果集上应用order by.我们将添加ItemNo我们给定的结果集.


jln*_*thy 7

我不确定,根据你的问题,如果你想要编号的行会记住他们的数字,即使基础数据发生变化(并给出不同的排序),但是如果你只想要编号的行 - 那就重置了客户ID的变化,然后尝试使用row_number()的Partition by子句

row_number() over(partition by CustomerID order by CustomerID)
Run Code Online (Sandbox Code Playgroud)


Mer*_*rmi 7

select 
  ROW_NUMBER() Over (Order by CustomerID) As [S.N.], 
  CustomerID , 
  CustomerName, 
  Address, 
  City, 
  State, 
  ZipCode  
from Customers;
Run Code Online (Sandbox Code Playgroud)

  • “ rep whoring!”是什么意思。您认为像您这样受过良好教育的人在公共论坛上发表这样的言论是否很好? (2认同)

Aru*_*zhi 6

无需订购任何列即可实现序列号

\n\n

在此输入图像描述

\n\n

演示 SQL 脚本 -

\n\n
IF OBJECT_ID(\'Tempdb..#TestTable\') IS NOT NULL\n    DROP TABLE #TestTable;\n\nCREATE TABLE #TestTable (Names VARCHAR(75), Random_No INT); \n\nINSERT INTO #TestTable (Names,Random_No) VALUES\n (\'Animal\', 363)\n,(\'Bat\', 847)\n,(\'Cat\', 655)\n,(\'Duet\', 356)\n,(\'Eagle\', 136)\n,(\'Frog\', 784)\n,(\'Ginger\', 690); \n\nSELECT * FROM #TestTable;\n
Run Code Online (Sandbox Code Playgroud)\n\n

SQL Server 中有 \xe2\x80\x98N\xe2\x80\x99 方法用于实现序列号。在此,我们提到了用于生成序列号的简单 Row_Number 函数。

\n\n

ROW_NUMBER() 函数是窗口函数之一,它按顺序对所有行进行编号(例如 1、2、3、\xe2\x80\xa6)。它是运行查询时将计算的临时值。它必须有一个带有 ORDER BY 的 OVER 子句。因此,我们不能简单地省略 Order By 子句。但我们可以像下面这样使用-

\n\n

SQL脚本

\n\n
IF OBJECT_ID(\'Tempdb..#TestTable\') IS NOT NULL\n    DROP TABLE #TestTable;\n\nCREATE TABLE #TestTable (Names VARCHAR(75), Random_No INT); \n\nINSERT INTO #TestTable (Names,Random_No) VALUES\n (\'Animal\', 363)\n,(\'Bat\', 847)\n,(\'Cat\', 655)\n,(\'Duet\', 356)\n,(\'Eagle\', 136)\n,(\'Frog\', 784)\n,(\'Ginger\', 690); \n\nSELECT Names,Random_No,ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS SERIAL_NO FROM #TestTable;\n
Run Code Online (Sandbox Code Playgroud)\n\n

在上面的查询中,我们还可以使用 SELECT 1, SELECT \xe2\x80\x98ABC\xe2\x80\x99, SELECT \xe2\x80\x9d 而不是 SELECT NULL。结果是相同的。

\n