SQL Server - 按顺序重新编号

时间:2017-10-15 00:45:52

标签: sql-server-2008-r2

我有一个表需要重新排序列,但我需要按日期保留原始顺序。

TABLE_1
id                                   num_seq  DateTimeStamp
fb4e1683-7035-4895-b2c8-d084d9b42ce3 111      08-02-2005
e40e4c3e-65e4-47b7-b13a-79e8bce2d02d 114      10-07-2017
49e261a8-a855-4844-a0ac-37b313da2222 113      01-30-2010
6c4bffb7-a056-4a20-ae1c-5a31bdf683f2 112      04-15-2006

我想重新排序从1001到1004开始的num_seq,并按顺序保持编号。所以111 = 1001和112 = 1002等等。 这就是我到目前为止所做的:

DECLARE @num INT 
SET @num = 0 
UPDATE Table_1 
SET @num = num_seq = @id + 1 
GO 

我知道UPDATE不允许我使用关键字ORDER BY。有没有办法在SQL 2008 R2中执行此操作?

1 个答案:

答案 0 :(得分:1)

在CTE中暂存新num_seq,然后在更新语句中利用它:

declare @Table_1 table (id uniqueidentifier, num_seq int, DateTimeStamp datetime);
insert into @Table_1
values
    ('fb4e1683-7035-4895-b2c8-d084d9b42ce3', 111,  '08-02-2005'),
    ('e40e4c3e-65e4-47b7-b13a-79e8bce2d02d', 114,  '10-07-2017'),
    ('49e261a8-a855-4844-a0ac-37b313da2222', 113,  '01-30-2010'),
    ('6c4bffb7-a056-4a20-ae1c-5a31bdf683f2', 112,  '04-15-2006');

;with stage as 
(
    select  *, 
            num_seq_new = 1000 + row_number()over(order by DateTimeStamp asc)
    from    @Table_1
)
update stage
set    num_seq = num_seq_new;


select * from @Table_1

返回:

id                                      num_seq DateTimeStamp
FB4E1683-7035-4895-B2C8-D084D9B42CE3    1001    2005-08-02 00:00:00.000
E40E4C3E-65E4-47B7-B13A-79E8BCE2D02D    1004    2017-10-07 00:00:00.000
49E261A8-A855-4844-A0AC-37B313DA2222    1003    2010-01-30 00:00:00.000
6C4BFFB7-A056-4A20-AE1C-5A31BDF683F2    1002    2006-04-15 00:00:00.000