0

表架构:

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。所以在这里,为 4 的 STatusId 的 SortOrder 为 1。为 5 的 StatusId 的 SortOrder 为 2。底部 2 行也是如此,但这里的一个部门可能有 100 行,70 行打开,30 行关闭,因此打开的行编号为 1 - 70 和 Closed 将是 71 - 100。

关于在不使用游标的情况下做到这一点的任何建议?我的蜘蛛侠感觉告诉我,可能有一种更直接的方法可以做到这一点。

任何帮助表示赞赏。

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

4

1 回答 1

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;
于 2013-02-04T21:59:01.220 回答