我有一个客户交易表。我需要创建一个包含序列号伪列的查询。序列号应自动重置,并在客户ID更改时从1开始重新开始。
现在,我熟悉SQL中的row_number()函数。这并不能完全解决我的问题,因为据我所知,如果行的顺序发生变化,序列号将不会被重置。
我想在单个查询(SQL Server)中执行此操作,而无需通过任何临时表使用等。
有什么想法吗?
提前致谢
答案 0 :(得分:11)
有时我们可能不想在我们的结果集上应用排序来添加序列号。但是如果我们要使用ROW_NUMBER()
那么我们必须有一个ORDER BY
子句。因此,为此我们可以简单地应用一些技巧来避免对结果集进行任何排序。
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS ItemNo, ItemName FROM ItemMastetr
为此,我们不需要在结果集上应用订单。我们只需在给定的结果集上添加ItemNo
。
答案 1 :(得分:6)
我不确定,根据你的问题,如果你想要编号的行会记住他们的数字,即使基础数据发生变化(并给出不同的排序),但如果你只想要编号的行 - 那就重置了一个变化在客户ID中,然后尝试使用row_number()
的Partition by子句row_number() over(partition by CustomerID order by CustomerID)
答案 2 :(得分:4)
select
ROW_NUMBER() Over (Order by CustomerID) As [S.N.],
CustomerID ,
CustomerName,
Address,
City,
State,
ZipCode
from Customers;
答案 3 :(得分:2)
在不对任何列进行排序的情况下实现序列号
演示SQL脚本-
IF OBJECT_ID('Tempdb..#TestTable') IS NOT NULL
DROP TABLE #TestTable;
CREATE TABLE #TestTable (Names VARCHAR(75), Random_No INT);
INSERT INTO #TestTable (Names,Random_No) VALUES
('Animal', 363)
,('Bat', 847)
,('Cat', 655)
,('Duet', 356)
,('Eagle', 136)
,('Frog', 784)
,('Ginger', 690);
SELECT Names,Random_No,ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS SERIAL_NO FROM #TestTable;
在SQL Server中可以使用“ N”种方法来实现序列号。在此,我们提到了用于生成序列号的简单行号函数。
ROW_NUMBER()函数是窗口函数之一,该窗口函数对所有行进行顺序编号(例如1、2、3,…)。它是一个临时值,将在运行查询时进行计算。它必须有一个ORDER BY的OVER子句。因此,我们无法省略“按条款简单排序”。但是我们可以像下面这样使用
SQL脚本
import collections
d = collections.defaultdict(int)
assert d['test1'] == 0
print(d)
# defaultdict(<class 'int'>, {'test1': 0})
assert d.get('test2', 0) == 0
# for a more generic version, use `d.default_factory()` instead of 0
print(d)
# defaultdict(<class 'int'>, {'test1': 0})
# => did NOT insert a key for 'test2' =)
在上述查询中,我们也可以使用SELECT 1,SELECT'ABC',SELECT来代替SELECT NULL。结果将是相同的。
答案 4 :(得分:1)
select ROW_NUMBER() over (order by pk_field ) as srno
from TableName
答案 5 :(得分:1)
SELECT ROW_NUMBER() OVER (ORDER BY ColumnName1) As SrNo, ColumnName1, ColumnName2 FROM TableName
答案 6 :(得分:0)
使用公用表表达式(CTE)
WITH CTE AS(
SELECT ROW_NUMBER() OVER(ORDER BY CustomerId) AS RowNumber,
Customers.*
FROM Customers
)
SELECT * FROM CTE
答案 7 :(得分:0)
我发现一种针对MYSQL的解决方案,通过遵循以下查询,可以轻松地为SrNo或tepropery自动增量列添加新列:
SELECT @ab:=@ab+1 as SrNo, tablename.* FROM tablename, (SELECT @ab:= 0)
AS ab
答案 8 :(得分:0)
ALTER function dbo.FN_ReturnNumberRows(@Start int, @End int) returns @Numbers table (Number int) as
begin
insert into @Numbers
select n = ROW_NUMBER() OVER (ORDER BY n)+@Start-1 from (
select top (@End-@Start+1) 1 as n from information_schema.columns as A
cross join information_schema.columns as B
cross join information_schema.columns as C
cross join information_schema.columns as D
cross join information_schema.columns as E) X
return
end
GO
select * from dbo.FN_ReturnNumberRows(10,9999)