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

如何用SQL实现Column A独热编码并映射Column B对应值?

解决SQL实现独热编码并转换表格的问题

源表格

Column AColumn B
A26.8
B23.5
C22.5
A21.9
B23.1
C29.1

目标表格

ABC
26.823.522.5
21.923.129.1

核心思路

要完成这个转换,关键是先给每组相同Column A值的行分配一个组ID,明确哪些值属于目标表格的同一行。之后通过PIVOT函数或条件聚合将Column A的取值转为列,并把对应Column B的值填入正确位置。

各数据库实现方案

SQL Server(使用PIVOT)

WITH RankedData AS (
    SELECT 
        ColumnA,
        ColumnB,
        -- 按Column A分组生成组内序号作为组ID
        ROW_NUMBER() OVER (PARTITION BY ColumnA ORDER BY (SELECT NULL)) AS GroupId
    FROM YourTable -- 替换为你的表名
)
SELECT 
    A, B, C
FROM RankedData
PIVOT (
    MAX(ColumnB) -- 聚合函数,每组仅一个值,MAX不影响结果
    FOR ColumnA IN (A, B, C) -- 指定要转为列的Column A取值
) AS PivotTable;

PostgreSQL/MySQL 8.0+(使用条件聚合)

这两个数据库无原生PIVOT函数,条件聚合是更通用的方案:

WITH RankedData AS (
    SELECT 
        column_a,
        column_b,
        ROW_NUMBER() OVER (PARTITION BY column_a ORDER BY (SELECT NULL)) AS group_id
    FROM your_table -- 替换为你的表名
)
SELECT 
    MAX(CASE WHEN column_a = 'A' THEN column_b END) AS A,
    MAX(CASE WHEN column_a = 'B' THEN column_b END) AS B,
    MAX(CASE WHEN column_a = 'C' THEN column_b END) AS C
FROM RankedData
GROUP BY group_id
ORDER BY group_id;

MySQL 5.x(无CTE和ROW_NUMBER()的情况)

旧版MySQL可通过变量生成组ID:

SET @row_num = 0;
SET @current_col_a = '';

SELECT 
    MAX(CASE WHEN column_a = 'A' THEN column_b END) AS A,
    MAX(CASE WHEN column_a = 'B' THEN column_b END) AS B,
    MAX(CASE WHEN column_a = 'C' THEN column_b END) AS C
FROM (
    SELECT 
        column_a,
        column_b,
        @row_num := IF(@current_col_a = column_a, @row_num + 1, 1) AS group_id,
        @current_col_a := column_a
    FROM your_table
    ORDER BY column_a
) AS RankedData
GROUP BY group_id
ORDER BY group_id;

注意事项

  • ORDER BY (SELECT NULL):若不需要特定行顺序,可用此占位符;若有明确排序逻辑(如时间),替换为对应列即可。
  • 若Column A的取值不固定(可能新增D、E等),需用动态SQL生成列,具体语法可根据数据库调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 08:35:18