【问题标题】:Re-Sequence a set of data in SQL Server在 SQL Server 中重新排序一组数据
【发布时间】:2009-10-13 15:23:45
【问题描述】:

我有一个这样的值表:

CREATE TABLE 
(
    Name1 VARCHAR (50),
    Name2 VARCHAR (50),
    Sequence INT
)

在这张表中我有这样的行

'Bob', 'Jones', 1
'James','Ant', 2

我想要根据 Name2 列的顺序来更新(UPDATE SET)序列的最佳方式,所以当重新排序时,值是:

'James','Ant', 1
'Bob', 'Jones', 2

我很确定这可以通过 CTE 的 ROW_NUMBER OVER() 样式完成,但不确定确切的语法。

【问题讨论】:

    标签: sql sql-server tsql common-table-expression


    【解决方案1】:

    您可以更新 CTE:

    WITH OrderedT AS
    (
      SELECT Sequence, 
      ROW_NUMBER() OVER (ORDER BY Name2, Name1) as rn
      FROM T
    )
    UPDATE OrderedT
    SET Sequence = rn;
    

    【讨论】:

    • 仅供参考,对我的示例表和数据使用 SET SHOWPLAN_ALL ON,它的 TotalSubtreeCost 为 0.02465125,而 CTE+UPDATE 和我的派生表都有 0.0513813,是 UPDATE CTE 的两倍多
    【解决方案2】:

    这样的事情怎么样:

    WITH OrderedByName AS
    (
      SELECT Name1, Name2, 
      ROW_NUMBER() OVER(ORDER BY Name2, Name1) as 'RowNum'
      FROM YourTable
    )
    UPDATE YourTable
    SET Sequence = obn.RowNum
    FROM OrderedByName obn
    WHERE obn.Name1 = YourTable.Name1 
      AND obn.Name2 = YourTable.Name2
    

    马克

    【讨论】:

      【解决方案3】:

      您不需要使用 CTE,派生表也可以,试试这个:

      create table abc 
      (
          Name1 VARCHAR (50),
          Name2 VARCHAR (50),
          Sequence INT
      )
      
      insert into abc values ('Bob', 'Jones', 1
      )
      insert into abc values ('James','Ant', 2
      )
      
      SELECT * FROM abc ORDER BY Sequence
      
      UPDATE a
          SET Sequence=dt.Rank
          FROM abc a
              INNER JOIN (SELECT
                              Name1, Name2 
                                  ,ROW_NUMBER() OVER(ORDER BY Name2, Name1,Sequence) AS Rank
                           FROM abc
                         ) dt ON a.Name1=dt.Name1 AND a.Name2=dt.Name2
      
      SELECT * FROM abc ORDER BY Sequence
      

      输出:

      Name1               Name2    Sequence
      ------------------- -------- -----------
      Bob                 Jones    1
      James               Ant      2
      
      (2 row(s) affected)
      
      (2 row(s) affected)
      
      Name1               Name2    Sequence
      ------------------- -------- -----------
      James               Ant      1
      Bob                 Jones    2
      
      (2 row(s) affected)
      

      【讨论】:

        【解决方案4】:

        响应 KM 的解决方案 - 早于 2005 年的 MS SQL 不支持 ROW_NUMBER()。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-17
          • 1970-01-01
          • 2012-02-14
          • 1970-01-01
          相关资源
          最近更新 更多