【问题标题】:Renumbering rows in SQL Server在 SQL Server 中重新编号行
【发布时间】:2025-12-18 06:05:02
【问题描述】:

我是 SQL Server 的新手,我有以下问题:是否有可能对列中的行重新编号?

例如:

id  date         name
1   2016-01-02   John
2   2016-01-02   Jack
3   2016-01-02   John
4   2016-01-02   John
5   2016-01-03   Jack
6   2016-01-03   Jack
7   2016-01-04   John
8   2016-01-03   Jack
9   2016-01-02   John
10  2016-01-04   Jack

我希望所有“Johns”都以 id 1 开头并继续(2、3、4 等),并且所有“Jacks”在“John”完成后都有以下编号(5、6、7 等) .谢谢!

【问题讨论】:

  • 如果id 是主键,则不应更改它的值。
  • 我认为的一个关键问题 :).. 你能标记你的 DBMS 吗?
  • 您为什么要这样做? Tim 是对的:如果id 是主键,则不需要这样做(如果该表被其他人引用,那就很难了)
  • 为什么? id只是一个id,没有其他意义。
  • @cdrrr 如果你有 21 个约翰呢?

标签: sql sql-server tsql select


【解决方案1】:

我希望这会有所帮助..

declare @t table (id  int ,[date] date,name varchar(20))
insert into @t
        ( id, date, name )
values  (1,'2016-01-02','John')
,(2,'2016-01-02','Jack')
,(3,'2016-01-02','John')
,(4,'2016-01-02','John')
,(5,'2016-01-03','Jack')
,(6,'2016-01-03','Jack')
,(7,'2016-01-04','John')
,(8,'2016-01-03','Jack')
,(9,'2016-01-02','John')
,(10,'2016-01-04','Jack')

select 
    row_number() over(order by name,[date]) as ID,
    date ,
    name 
from 
    @t
order by name

【讨论】:

    【解决方案2】:

    id 应该只是用于连接等的内部标识符 - 我不会更改它。但是您可以使用窗口函数查询这样的编号:

    SELECT ROW_NUMBER() OVER (ORDER BY CASE name WHEN 'John' THE 1 ELSE 2 END) AS rn,
           date,
           name
    FROM   mytable
    

    【讨论】:

      【解决方案3】:

      您可以使用ROW_NUMBER 窗口函数根据您的要求对行重新编号,而不是重新编号列。例如:

      SELECT ROW_NUMBER() OVER(PARTITION BY name ORDER BY date) as rowid,date,name
      FROM tablename
      

      【讨论】: