SQL:根据其他列更新SortIndex

时间:2015-01-30 15:19:11

标签: sql sql-server

我有一张这样的表:

StepId | VehicleId| Description  | SortIndex
---------------------------
1      |xxx       | Description1 | 0
2      |yyyyy     | Description2 | 0
3      |yyyyy     | Description3 | 0

因此,一辆车可以有0到n步(由vehicleId引用)。 到目前为止,我按说明列排序了步骤。我现在想要更新SortIndex列,以便它们具有值,就像我按描述列对它们进行排序一样。因此,对于上面的示例,我希望:

   StepId | VehicleId| Description  | SortIndex
    ---------------------------
    1      |xxx       | Description1 | 1
    2      |yyyyy     | Description2 | 1
    3      |yyyyy     | Description3 | 2

我能做什么SQL魔法来实现这个目标?

由于

编辑:我使用的是SQL Server,也许游标可以完成这项任务

2 个答案:

答案 0 :(得分:0)

由于您在SQL Server,您可以使用以下使用排名功能的查询:

SELECT StepId, VehicleId, Description, ROW_NUMBER() OVER (PARTITION BY VehicleId ORDER BY Description) as SortIndex 
FROM #Vehicle

row_number()会根据订单Description组中的VehicleId按其订单生成每行的编号。

答案 1 :(得分:0)

最简单的方法(在我看来)是使用带窗口函数的可更新CTE:

with toupdate as (
      select t.*,
             row_number() over (partition by vehicleId order by Description) as NewSortIndex
      from likethat
     )
update toupdate
    set SortIndex = NewSortIndex;

如果您不想要update但只是要返回结果,只需在CTE中使用该查询。