如何将多行数据合并为单行?同ID字段值合并技术问询
如何将crosstab生成的单值多行表格合并为ID唯一的单行表格?
原始表格(crosstab输出)
| ID | c1 | c2 | c3 |
|---|---|---|---|
| 1 | 1 | ||
| 1 | 4 | ||
| 1 | 12 | ||
| 15 | 2 | ||
| 15 | 3 |
目标表格
| ID | c1 | c2 | c3 |
|---|---|---|---|
| 1 | 4 | 1 | 12 |
| 15 | 2 | 3 |
最优实现方案
方案1:用聚合函数MAX()/MIN()结合GROUP BY
你担心的“不必要计算”其实不存在——因为每个ID对应的每个列最多只有一个非空值,MAX()或MIN()会直接忽略空值,取到唯一的非空值,计算成本极低,数据库引擎会做针对性优化,执行效率很高。
具体SQL代码:
SELECT ID, MAX(c1) AS c1, MAX(c2) AS c2, MAX(c3) AS c3 FROM your_crosstab_result_table GROUP BY ID;
方案2:优化原始crosstab查询(一步到位)
如果你的crosstab是基于未聚合的源数据生成的,那可以直接在crosstab的源查询中完成聚合,避免后续再处理。
假设原始crosstab查询是这样的:
SELECT * FROM crosstab( 'SELECT ID, category, value FROM your_source_data', 'SELECT DISTINCT category FROM your_source_data ORDER BY 1' ) AS ct(ID INT, c1 INT, c2 INT, c3 INT);
修改为带聚合的源查询,直接生成ID唯一的结果:
SELECT * FROM crosstab( 'SELECT ID, category, MAX(value) FROM your_source_data GROUP BY ID, category ORDER BY 1, 2', 'SELECT DISTINCT category FROM your_source_data ORDER BY 1' ) AS ct(ID INT, c1 INT, c2 INT, c3 INT);
这个方案从源头解决问题,减少了中间数据量,是更高效的做法。
内容的提问来源于stack exchange,提问作者Graf123456
相关产品推荐
相关产品推荐

