You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

T-SQL如何按人员最低RANK排序并保留同人员行组,RANK≥100按姓名+RANK排序

解决方案

实现思路

  • 先通过窗口函数为每个用户计算其所有职位的最小RANK值,同时标记该用户是否属于VIP范畴(存在至少一个RANK<100的职位即为VIP用户)
  • 排序时分四层优先级:
    1. VIP用户整体排在非VIP用户前
    2. VIP用户按个人最小RANK值升序排列,保证优先级越高的用户整体越靠前
    3. VIP用户按用户唯一ID聚合,保证同一名用户的所有行连续排列;非VIP用户按姓名升序排列
    4. 同用户内部按职位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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 15:54:03