SQL Server 在SQL查询中生成行序列号

ilmyapht  于 2022-12-22  发布在  其他
关注(0)|答案(9)|浏览(352)

我有一个客户事务表。我需要创建一个包含序列号伪列的查询。序列号应该在客户ID更改时自动重置并从1重新开始。
现在,我熟悉了SQL中的row_number()函数。这并不能完全解决我的问题,因为据我所知,如果行的顺序发生变化,序列号不会重置。
我想在单个查询(SQL Server)中完成此操作,而不必使用任何临时表等。如何完成此操作?

9udxz4iz

9udxz4iz1#

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

SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS ItemNo, ItemName FROM ItemMastetr

为此,我们不需要对结果集应用order by,只需要在给定的结果集上添加ItemNo即可。

neekobn8

neekobn82#

select 
  ROW_NUMBER() Over (Order by CustomerID) As [S.N.], 
  CustomerID , 
  CustomerName, 
  Address, 
  City, 
  State, 
  ZipCode  
from Customers;
thigvfpy

thigvfpy3#

我不确定,根据您的问题,如果您想要编号行,即使底层数据发生更改(并给出不同的排序),也会记住它们的编号,但如果您只想要编号行-在客户ID发生更改时重置,那么尝试使用row_number()的Partition by子句

row_number() over(partition by CustomerID order by CustomerID)
ipakzgxi

ipakzgxi4#

实现序列号而不对任何列排序

演示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 * FROM #TestTable;

在SQL Server中实现序列号的方法有“N”种。在此,我们提到了简单的Row_Number函数来生成序列号。
ROW_NUMBER()函数是窗口函数之一,它按顺序对所有行进行编号(例如1、2、3...)。它是一个临时值,将在查询运行时计算。它必须有一个带ORDER BY的OVER子句。因此,我们不能简单地省略ORDER BY子句。但我们可以使用如下语句-

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;

在上面的查询中,我们也可以使用SELECT 1、SELECT 'ABC'、SELECT“来代替SELECT NULL。结果相同。

brccelvz

brccelvz5#

SELECT ROW_NUMBER()  OVER (ORDER BY  ColumnName1) As SrNo, ColumnName1,  ColumnName2 FROM  TableName
yrdbyhpb

yrdbyhpb6#

select ROW_NUMBER() over (order by pk_field ) as srno 
from TableName
mu0hgdu0

mu0hgdu07#

使用公用表表达式(CTE)

WITH CTE AS(
    SELECT ROW_NUMBER() OVER(ORDER BY CustomerId) AS RowNumber,
    Customers.*
    FROM Customers
)
SELECT * FROM CTE
zf2sa74q

zf2sa74q8#

我发现了一个解决方案MYSQL它很容易添加新列的SrNo或一种热属性自动增量列以下查询:

SELECT @ab:=@ab+1 as SrNo, tablename.* FROM tablename, (SELECT @ab:= 0)
AS ab
guz6ccqo

guz6ccqo9#

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)

相关问题