我有一个客户交易表.我需要创建一个包含序列号伪列的查询.序列号应自动重置,并在客户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我们给定的结果集.
我不确定,根据你的问题,如果你想要编号的行会记住他们的数字,即使基础数据发生变化(并给出不同的排序),但是如果你只想要编号的行 - 那就重置了客户ID的变化,然后尝试使用row_number()的Partition by子句
row_number() over(partition by CustomerID order by CustomerID)
Run Code Online (Sandbox Code Playgroud)
select
ROW_NUMBER() Over (Order by CustomerID) As [S.N.],
CustomerID ,
CustomerName,
Address,
City,
State,
ZipCode
from Customers;
Run Code Online (Sandbox Code Playgroud)
无需订购任何列即可实现序列号
\n\n\n\n演示 SQL 脚本 -
\n\nIF 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;\nRun Code Online (Sandbox Code Playgroud)\n\nSQL Server 中有 \xe2\x80\x98N\xe2\x80\x99 方法用于实现序列号。在此,我们提到了用于生成序列号的简单 Row_Number 函数。
\n\nROW_NUMBER() 函数是窗口函数之一,它按顺序对所有行进行编号(例如 1、2、3、\xe2\x80\xa6)。它是运行查询时将计算的临时值。它必须有一个带有 ORDER BY 的 OVER 子句。因此,我们不能简单地省略 Order By 子句。但我们可以像下面这样使用-
\n\nSQL脚本
\n\nIF 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;\nRun Code Online (Sandbox Code Playgroud)\n\n在上面的查询中,我们还可以使用 SELECT 1, SELECT \xe2\x80\x98ABC\xe2\x80\x99, SELECT \xe2\x80\x9d 而不是 SELECT NULL。结果是相同的。
\n