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

MySQL如何将同日期时间的多行数据合并为单行输出?

问题描述

现有一张存储采样数据的表,表结构及示例数据如下:

iddatetimelabeli1i2
12022-07-2511:53:00X0.11160.0
22022-07-2511:53:00Y0.22270.0
32022-07-2511:53:00Z0.33380.0
42022-07-2511:53:10Z1.999100.0
52022-07-2511:53:10X1.888200.0
62022-07-2511:53:10Y1.777300.0

每次写入采样数据时,会生成3条对应label为X、Y、Z的记录,这3条记录的date和time完全相同,仅其他字段不同(id为唯一主键)。需要将同一date和time的3条记录合并为单行,预期输出格式如下:

iddatetimelabeli1_xi2_xi1_yi2_yi1_zi2_z
12022-07-2511:53:00XYZ0.11160.00.22270.00.33380.0
42022-07-2511:53:10XYZ1.888200.01.777300.01.999100.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 22:15:41