表架构:
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。 这很难解释,但希望这有点帮助。
答案 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;