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

SQL Server如何按列值排序将对应列名填入a_1st至a_4th列

SQL行级多列值排名更新方案

核心思路

将每行需要排序的a_LOG、a_RF、a_GNB、a_SVC四列拆为键值对行,按值降序+列名升序排名后,再行转列回填到a_1st至a_4th字段,无需编写复杂嵌套的判断逻辑。

实现代码

SQL Server

WITH RankedColumns AS (
    SELECT 
        t.RowCnt, t.Lvl, t.a_TargetID, t.b_TargetID,
        v.col_name,
        ROW_NUMBER() OVER (
            PARTITION BY t.RowCnt, t.Lvl, t.a_TargetID, t.b_TargetID 
            ORDER BY v.col_value DESC, v.col_name ASC
        ) AS rank_num
    FROM Targets t
    CROSS APPLY (
        VALUES 
            ('a_LOG', a_LOG), 
            ('a_RF', a_RF), 
            ('a_GNB', a_GNB), 
            ('a_SVC', a_SVC)
    ) v(col_name, col_value)
)
UPDATE t
SET 
    a_1st = MAX(CASE WHEN rc.rank_num = 1 THEN rc.col_name END),
    a_2nd = MAX(CASE WHEN rc.rank_num = 2 THEN rc.col_name END),
    a_3rd = MAX(CASE WHEN rc.rank_num = 3 THEN rc.col_name END),
    a_4th = MAX(CASE WHEN rc.rank_num = 4 THEN rc.col_name END)
FROM Targets t
INNER JOIN RankedColumns rc 
    ON t.RowCnt = rc.RowCnt 
    AND t.Lvl = rc.Lvl 
    AND t.a_TargetID = rc.a_TargetID 
    AND t.b_TargetID = rc.b_TargetID
GROUP BY t.RowCnt, t.Lvl, t.a_TargetID, t.b_TargetID, t.a_1st, t.a_2nd, t.a_3rd, t.a_4th

MySQL 8.0+/PostgreSQL

WITH RankedColumns AS (
    SELECT 
        RowCnt, Lvl, a_TargetID, b_TargetID,
        'a_LOG' AS col_name, a_LOG AS col_value FROM Targets
    UNION ALL
    SELECT RowCnt, Lvl, a_TargetID, b_TargetID, 'a_RF' AS col_name, a_RF AS col_value FROM Targets
    UNION ALL
    SELECT RowCnt, Lvl, a_TargetID, b_TargetID, 'a_GNB' AS col_name, a_GNB AS col_value FROM Targets
    UNION ALL
    SELECT RowCnt, Lvl, a_TargetID, b_TargetID, 'a_SVC' AS col_name, a_SVC AS col_value FROM Targets
),
Ranked AS (
    SELECT *,
        ROW_NUMBER() OVER (
            PARTITION BY RowCnt, Lvl, a_TargetID, b_TargetID 
            ORDER BY col_value DESC, col_name ASC
        ) AS rank_num
    FROM RankedColumns
)
UPDATE Targets t
JOIN (
    SELECT 
        RowCnt, Lvl, a_TargetID, b_TargetID,
        MAX(CASE WHEN rank_num = 1 THEN col_name END) AS r1,
        MAX(CASE WHEN rank_num = 2 THEN col_name END) AS r2,
        MAX(CASE WHEN rank_num = 3 THEN col_name END) AS r3,
        MAX(CASE WHEN rank_num = 4 THEN col_name END) AS r4
    FROM Ranked
    GROUP BY RowCnt, Lvl, a_TargetID, b_TargetID
) tmp
    ON t.RowCnt = tmp.RowCnt 
    AND t.Lvl = tmp.Lvl 
    AND t.a_TargetID = tmp.a_TargetID 
    AND t.b_TargetID = tmp.b_TargetID
SET t.a_1st = tmp.r1, t.a_2nd = tmp.r2, t.a_3rd = tmp.r3, t.a_4th = tmp.r4

方案优势

  • 无需编写复杂嵌套的CASE判断逻辑,代码可读性强
  • 扩展性高,后续新增需要排序的指标列,仅需在键值对生成部分新增对应条目即可
  • 支持自定义同值排序规则,示例中同值按列名字母序排序,完全匹配预期结果

内容的提问来源于stack exchange,提问作者asmgx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:54:04