如何用SQL实现Column A独热编码并映射Column B对应值?
解决SQL实现独热编码并转换表格的问题
源表格
| Column A | Column B |
|---|---|
| A | 26.8 |
| B | 23.5 |
| C | 22.5 |
| A | 21.9 |
| B | 23.1 |
| C | 29.1 |
目标表格
| A | B | C |
|---|---|---|
| 26.8 | 23.5 | 22.5 |
| 21.9 | 23.1 | 29.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
相关产品推荐
相关产品推荐

