在SQL查询中生成行序列号

时间:2011-03-23 06:00:20

标签: sql-server

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

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

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

有什么想法吗?

提前致谢

9 个答案:

答案 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)

在不对任何列进行排序的情况下实现序列号

enter image description here

演示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)