T-SQL:如何按最低排名对多行的个人进行排序,但将他们的行分组在一起?
T-SQL: How can I order individuals with multiple rows by minimum Rank but keep their rows grouped together?
我正在创建委员会花名册报告。我有几百行数据,其中有姓名和职位,每个职位都有一个固定的等级,等级越低,该职位在委员会中的地位就越高。
我需要首先按照最重要(最低)的排名位置将 VIP 排序到顶部,如果他们在委员会中有任何其他职位,我需要在列表中按升序顺序将它们排在最前面, 然后是排名次优的位置VIP和他们的其他位置按Rank升序排列。
然后——大约100级左右——VIP的职位列表结束,所以我只想让大家从那时起先按名字再按等级排序。
这是我尝试按照我希望的方式组织的数据类型的模型:
RANK
POSITION
NAME
ID
1
Chair
Jane J.
10009
3
Treasurer
Jane J.
10009
9
Editor
Jane J.
10009
2
Vice Chair
Kevin K.
10002
5
Director
Kevin K.
10002
3
President
Laura L.
10003
4
Vice President
Manuel M.
10005
10
Asst. Editor
Manuel M.
10005
100
Member
Anna A.
10010
100
Member
Ben B.
10014
50
Coordinator
Carry C.
10020
100
Member
Carry C.
10020
60
Asst. Coord.
Dennis D.
10008
61
Mbr. Coord.
Dennis D.
10008
下面是我目前正在使用的 SELECT 语句的简化模型,它没有实现我正在寻找的内容。我尝试了很多自定义列来尝试使我正在寻找的自定义排序成为可能,但 none 有所帮助。
SELECT
RANK
, POSITION_CODE
, LAST_FIRST
FROM Table
ORDER BY RANK, LAST_FIRST
SELECT
MIN(RANK) OVER (PARTITION BY ID) AS MinRank
, RANK
, POSITION_CODE
, LAST_FIRST
, ID
FROM Table
ORDER BY MinRank, RANK, LAST_FIRST
编辑:使用我的新 MinRank 计算,我现在可以首先 ORDER BY
委员会成员的职位 (POSITION_CODE) 具有最低的排名(较低在我的委员会中地位更高的职位的数字)。这会将排名最高的 Position 委员会成员置于列表顶部,并通过其他人的 MinRank 上升,导致列表将具有相同最小 RANK 位置的名称块排序在一起。然后我可以 ORDER BY
RANK ascending,这将对这些块本身的排名较低的位置进行排序。最后,我可以 ORDER BY
他们的名字 (LAST_FIRST) 以便 RANK 排序的 MinRanks 的每个块都按姓氏和名字的字母顺序排列。如果需要,为了获得额外的区别,我还可以在最后添加 ORDER BY
ID,以区分具有相同名字和姓氏的人。
我的 MIN(RANK)
聚合的 OVER (PARTITION BY ID)
只是一个快捷方式,所以我不必将我所有的属性都放入 GROUP BY
.
我正在创建委员会花名册报告。我有几百行数据,其中有姓名和职位,每个职位都有一个固定的等级,等级越低,该职位在委员会中的地位就越高。
我需要首先按照最重要(最低)的排名位置将 VIP 排序到顶部,如果他们在委员会中有任何其他职位,我需要在列表中按升序顺序将它们排在最前面, 然后是排名次优的位置VIP和他们的其他位置按Rank升序排列。
然后——大约100级左右——VIP的职位列表结束,所以我只想让大家从那时起先按名字再按等级排序。
这是我尝试按照我希望的方式组织的数据类型的模型:
RANK | POSITION | NAME | ID |
---|---|---|---|
1 | Chair | Jane J. | 10009 |
3 | Treasurer | Jane J. | 10009 |
9 | Editor | Jane J. | 10009 |
2 | Vice Chair | Kevin K. | 10002 |
5 | Director | Kevin K. | 10002 |
3 | President | Laura L. | 10003 |
4 | Vice President | Manuel M. | 10005 |
10 | Asst. Editor | Manuel M. | 10005 |
100 | Member | Anna A. | 10010 |
100 | Member | Ben B. | 10014 |
50 | Coordinator | Carry C. | 10020 |
100 | Member | Carry C. | 10020 |
60 | Asst. Coord. | Dennis D. | 10008 |
61 | Mbr. Coord. | Dennis D. | 10008 |
下面是我目前正在使用的 SELECT 语句的简化模型,它没有实现我正在寻找的内容。我尝试了很多自定义列来尝试使我正在寻找的自定义排序成为可能,但 none 有所帮助。
SELECT
RANK
, POSITION_CODE
, LAST_FIRST
FROM Table
ORDER BY RANK, LAST_FIRST
SELECT
MIN(RANK) OVER (PARTITION BY ID) AS MinRank
, RANK
, POSITION_CODE
, LAST_FIRST
, ID
FROM Table
ORDER BY MinRank, RANK, LAST_FIRST
编辑:使用我的新 MinRank 计算,我现在可以首先 ORDER BY
委员会成员的职位 (POSITION_CODE) 具有最低的排名(较低在我的委员会中地位更高的职位的数字)。这会将排名最高的 Position 委员会成员置于列表顶部,并通过其他人的 MinRank 上升,导致列表将具有相同最小 RANK 位置的名称块排序在一起。然后我可以 ORDER BY
RANK ascending,这将对这些块本身的排名较低的位置进行排序。最后,我可以 ORDER BY
他们的名字 (LAST_FIRST) 以便 RANK 排序的 MinRanks 的每个块都按姓氏和名字的字母顺序排列。如果需要,为了获得额外的区别,我还可以在最后添加 ORDER BY
ID,以区分具有相同名字和姓氏的人。
我的 MIN(RANK)
聚合的 OVER (PARTITION BY ID)
只是一个快捷方式,所以我不必将我所有的属性都放入 GROUP BY
.