使用group by(使用自联接)更新SQL语句到同一个表

时间:2017-04-07 15:37:40

标签: sql-server

我有一个示例数据集

BookID Book_Name Book_Version_Number  New Book Version Number (Proposed)
1       XYZ      1.0000               1.0000
1       XYZ      1.0000               2.0000
2       ABC      1.0000               1.0000
2       ABC      1.0000               2.0000
2       ABC      1.0000               3.0000

因此,我需要逐步和按顺序更新按标题分组的新书版本号。

我需要把它作为UPDATE SQL ...我的更新似乎失败,因为我的group by子句不起作用

2 个答案:

答案 0 :(得分:0)

您可以使用cte和row_number()

;WITH CTE AS
(
    SELECT BookId, 
           BookName, 
           Book_Version_Number,
           ROW_NUMBER() OVER(PARTITION BY BookId ORDER BY (SELECT NULL)) As rn
    FROM TableName
)

UPDATE CTE
SET Book_Version_Number = rn

答案 1 :(得分:0)

我更喜欢使用common table expression (cte)来做这类事情。

使用row_number()

;with cte as (
  select *
    , New_Book_Version_Number = row_number() over (
        partition by Book_Name /* Title */ 
        order by BookID
        )
  from Books
)
update cte
set Book_Version_Number = New_Book_Version_Number

如果您想在运行更新之前预览更改,只需将上面更改为select而不是update。请注意,只有cte之后的第一个语句才能使用cte。