对SQL Server中的行重新编号

对SQL Server中的行重新编号,sql,sql-server,tsql,select,Sql,Sql Server,Tsql,Select,我对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-

我对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等),当“John”完成时(5、6、7等),所有的“Jacks”都有以下数字。谢谢

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

SELECT ROW_NUMBER() OVER (ORDER BY CASE name WHEN 'John' THE 1 ELSE 2 END) AS rn,
       date,
       name
FROM   mytable
我希望这有帮助

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

您可以使用
ROW\u NUMBER
window函数根据需要对行重新编号,而不是对id列重新编号。例如:

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

如果
id
是主键,则不应更改其值。我认为这是一个关键问题:)。。你能标记你的数据库管理系统吗?你为什么要这样做?Tim是对的:如果
id
是主键,那么没有必要这样做(如果该表被其他人引用,这将非常困难)为什么?id只是一个id,没有其他意义。@cdrrr如果你有21个Johns呢?