T-SQL如何按人员最低RANK排序并保留同人员行组,RANK≥100按姓名+RANK排序
解决方案
实现思路
- 先通过窗口函数为每个用户计算其所有职位的最小RANK值,同时标记该用户是否属于VIP范畴(存在至少一个RANK<100的职位即为VIP用户)
- 排序时分四层优先级:
- VIP用户整体排在非VIP用户前
- VIP用户按个人最小RANK值升序排列,保证优先级越高的用户整体越靠前
- VIP用户按用户唯一ID聚合,保证同一名用户的所有行连续排列;非VIP用户按姓名升序排列
- 同用户内部按职位RANK值升序排列
完整T-SQL语句
WITH UserRankCalc AS ( SELECT [RANK], -- RANK为SQL保留字,用方括号包裹避免语法错误 POSITION_CODE, LAST_FIRST, ID, -- 计算每个用户所有职位的最小RANK值 MIN([RANK]) OVER (PARTITION BY ID) AS min_user_rank, -- 标记是否为VIP用户:存在至少一个RANK<100的职位 CASE WHEN MIN([RANK]) OVER (PARTITION BY ID) < 100 THEN 1 ELSE 0 END AS is_vip FROM [Table] -- 替换为你的实际表名 ) SELECT [RANK], POSITION_CODE, LAST_FIRST, ID FROM UserRankCalc ORDER BY -- 优先级1:VIP用户排在最前 is_vip DESC, -- 优先级2:VIP用户按个人最小RANK升序排列 CASE WHEN is_vip = 1 THEN min_user_rank END ASC, -- 优先级3:VIP用户按ID聚合保证同用户行连续,非VIP按姓名升序 CASE WHEN is_vip = 1 THEN ID END ASC, CASE WHEN is_vip = 0 THEN LAST_FIRST END ASC, -- 优先级4:同用户内部按职位RANK升序 [RANK] ASC;
注意事项
- 如果你的表中没有唯一标识用户的ID字段,可以将
PARTITION BY ID替换为PARTITION BY LAST_FIRST,同时将排序规则中的CASE WHEN is_vip = 1 THEN ID END ASC替换为CASE WHEN is_vip = 1 THEN LAST_FIRST END ASC即可。 - 如果需要完全匹配你给出的示例效果(即最小RANK≥10的用户也归入非VIP组),只需要将VIP判断逻辑修改为
CASE WHEN MIN([RANK]) OVER (PARTITION BY ID) < 10 THEN 1 ELSE 0 END即可。
内容的提问来源于stack exchange,提问作者Jake Livsey
相关产品推荐
相关产品推荐

