在有序表中编号列记录

时间:2013-02-04 21:54:31

标签: sql sql-server sql-server-2008 tsql

表架构:

StatusId    Status  DisplayColor    IsOpen  DivisionId  SortOrder
4           Open    3e696c          1       34          1
5           Closed  3e696c          0       34          2
1           Open    3e696c          1       35          1
2           Closed  3e696c          0       35          2

SQL查询我必须按照我需要的方式对列进行排序:

select  StatusId, Status, DisplayColor, IsOpen, DivisionId, SortOrder
from    TV_Statuses s
order by DivisionId, IsOpen desc

我正在尝试创建一个可以通过DivisionId和IsOpen逐步分配SortOrder的脚本。所以在这里,STatusId为4的SortOrder为1. StatusId为5将具有SortOrder 2.底部2行相同,但这里一个分区可以有100行,70个是打开的,30个是封闭的,因此open将被编号为1 - 70和关闭将是71 - 100.

有关如何在不诉诸游标的情况下执行此操作的任何建议?我的蜘蛛般的感觉告诉我,这可能是一种更直接的方式。

感谢任何帮助。

编辑: 好的,所以实际上在数据库中,SortOrder列中只有NULL。我想更新SortOrder列,以便每个Division(使用DivisionId)在SortOrder中有一个递增的数字。例如,上面的DivisioniId为34,其行为一个IsOPen = 1,一个IsOpen = 0.所以我想分别用SortOrder 1和2对这两行进行排序。 但是一个部门可能有10行。然后,分区SortOrder字段将是1,2,3,4,5,6,7,8,9,10。 这很难解释,但希望这有点帮助。

1 个答案:

答案 0 :(得分:2)

从SQL Server 2005开始,您可以将ROW_NUMBER()等窗口函数应用于集合(或子集,通常称为分区,但不要与表分区混淆)。我相信你要找的是以下内容:

SELECT 
  StatusId, Status, DisplayColor, IsOpen, DivisionId, 
  SortOrder = ROW_NUMBER() OVER 
    (PARTITION BY DivisionId ORDER BY IsOpen DESC, StatusId)
FROM dbo.TV_Statuses AS s
ORDER BY DivisionId, IsOpen DESC;