MySQL如何将同日期时间的多行数据合并为单行输出?
问题描述
现有一张存储采样数据的表,表结构及示例数据如下:
| id | date | time | label | i1 | i2 |
|---|---|---|---|---|---|
| 1 | 2022-07-25 | 11:53:00 | X | 0.111 | 60.0 |
| 2 | 2022-07-25 | 11:53:00 | Y | 0.222 | 70.0 |
| 3 | 2022-07-25 | 11:53:00 | Z | 0.333 | 80.0 |
| 4 | 2022-07-25 | 11:53:10 | Z | 1.999 | 100.0 |
| 5 | 2022-07-25 | 11:53:10 | X | 1.888 | 200.0 |
| 6 | 2022-07-25 | 11:53:10 | Y | 1.777 | 300.0 |
每次写入采样数据时,会生成3条对应label为X、Y、Z的记录,这3条记录的date和time完全相同,仅其他字段不同(id为唯一主键)。需要将同一date和time的3条记录合并为单行,预期输出格式如下:
| id | date | time | label | i1_x | i2_x | i1_y | i2_y | i1_z | i2_z |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 2022-07-25 | 11:53:00 | XYZ | 0.111 | 60.0 | 0.222 | 70.0 | 0.333 | 80.0 |
| 4 | 2022-07-25 | 11:53:10 | XYZ | 1.888 | 200.0 | 1.777 | 300.0 | 1.999 | 100.0 |
注意:原始数据中X、Y、Z的记录顺序不固定,需保证合并后能正确对应各自的字段。
解决方案
可以使用条件聚合的方式实现,这种方法兼容大多数关系型数据库(如MySQL、PostgreSQL、SQL Server等),不受原始记录顺序影响:
SELECT MIN(id) AS id, -- 取同一时间组内最小的id作为合并后的id,按需可替换为MAX(id) date, time, 'XYZ' AS label, MAX(CASE WHEN label = 'X' THEN i1 END) AS i1_x, MAX(CASE WHEN label = 'X' THEN i2 END) AS i2_x, MAX(CASE WHEN label = 'Y' THEN i1 END) AS i1_y, MAX(CASE WHEN label = 'Y' THEN i2 END) AS i2_y, MAX(CASE WHEN label = 'Z' THEN i1 END) AS i1_z, MAX(CASE WHEN label = 'Z' THEN i2 END) AS i2_z FROM your_table_name -- 替换为你的实际表名 GROUP BY date, time;
核心逻辑说明:
GROUP BY date, time:将同一时间点的3条记录归为一组CASE WHEN:根据label值定向提取对应字段的数据,用MAX(或MIN,因每组对应label仅一条记录)聚合确保只取到有效数据MIN(id):按照预期输出规则取组内最小id,若有其他需求可调整为MAX(id)'XYZ' AS label:直接生成合并后的固定label值
内容的提问来源于stack exchange,提问作者mw42
相关产品推荐
相关产品推荐

