使用SQL 2008R2将排序顺序应用于现有数据

时间:2011-04-16 11:41:24

标签: sql sql-server

我有一些现有数据需要根据以下几个因素应用“SortOrder”:

  1. 对于任何给定的所有者
  2. ,订购从“1”开始
  3. 按字母顺序排列(基本上遵循ORDER BY Name)以增加排序顺序。
  4. 如果两个项目具有相同的名称(正如我在数据集中所示),我们可以将较低的排序顺序值应用于ID较低的项目。
  5. 以下是一些示例数据,以帮助说明我在说什么:

    我有什么:

    Id      OwnerId   Name                     SortOrder  
    ------  -------   ----------------------   ---------  
    1        1         A Name                   NULL                        
    2        1         C Name                   NULL  
    3        1         B Name                   NULL  
    4        2         Z Name                   NULL  
    5        2         Z Name                   NULL  
    6        2         A Name                   NULL
    

    我需要什么:

    Id      OwnerId   Name                     SortOrder  
    ------  -------   ----------------------   ---------  
    1        1         A Name                   1                        
    3        1         B Name                   2  
    2        1         C Name                   3  
    6        2         A Name                   1  
    4        2         Z Name                   2   
    5        2         Z Name                   3  
    

    如果更容易将数据从一个表移动到下一个表,则可以以UPDATE语句的形式完成,也可以执行INSERT INTO (...) SELECT FROM (...)

1 个答案:

答案 0 :(得分:6)

轻松 - 使用CTE(通用表格表达式)和ROW_NUMBER()排名功能:

;WITH OrderedData AS
(
   SELECT Id, OwnerId, Name, 
      ROW_NUMBER() OVER(PARTITION BY OwnerId ORDER BY Name, Id) AS 'SortOrder'
   FROM
      dbo.YourTable
)
SELECT *
FROM OrderedData
ORDER BY OwnerId, SortOrder

PARTITION BY子句将您的数据分组为OwnerId的每个值,ROW_NUMBER()然后从每个新数据组的1开始计数。

更新:如果您要更新表格以设置SortOrder列,请尝试以下操作:

;WITH OrderedData AS
(
   SELECT 
      Id, OwnerId, Name, 
      ROW_NUMBER() OVER(PARTITION BY OwnerId ORDER BY Name, Id) AS 'RowNum'
   FROM
      dbo.YourTable
)
UPDATE OrderedData
SET SortOrder = RowNum

这应该将SortOrder列设置为ROW_NUMBER()函数返回的值