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

MySQL按Odl_ID分组合并多行事件数据并创建视图的实现方案求助

解决方案:用条件聚合实现行转列合并

这个需求用条件聚合就能轻松解决,不用复杂的pivot——毕竟MySQL本身没有原生的pivot功能,用CASE结合聚合函数反而更直接。核心思路是按Odl_ID分组,针对每个需要提取的字段,通过CASE语句筛选对应事件类型的行,再用聚合函数(比如MAX)提取有效数据(忽略NULL值)。

创建目标视图的SQL语句

CREATE VIEW consolidated_events AS
SELECT
    ROW_NUMBER() OVER (ORDER BY Odl_ID) AS ID,
    Odl_ID,
    -- 提取Start事件的Evt_Date
    MAX(CASE WHEN Evt_Desc = 'Start' THEN Evt_Date END) AS Evt_Date,
    -- 提取Generate PDF 1的Link_1
    MAX(CASE WHEN Evt_Desc = 'Generate PDF 1' THEN Link_1 END) AS Link_1,
    -- 提取Generate PDF 2的Link_2
    MAX(CASE WHEN Evt_Desc = 'Generate PDF 2' THEN Link_2 END) AS Link_2,
    -- 提取Start事件的Start_Time
    MAX(CASE WHEN Evt_Desc = 'Start' THEN Start_Time END) AS Start_Time,
    -- 提取Finish事件的End_Time
    MAX(CASE WHEN Evt_Desc = 'Finish' THEN End_Time END) AS End_Time
FROM event_table
GROUP BY Odl_ID
ORDER BY Odl_ID;

语句细节解释

  1. ROW_NUMBER() OVER (ORDER BY Odl_ID):生成目标视图里的自增ID,按Odl_ID排序,完全匹配你给出的目标结构。
  2. MAX(CASE ...):针对每个字段,只在对应事件类型的行中提取有效值,其他行返回NULL;MAX函数会自动忽略NULL,只保留对应事件的有效数据。
  3. GROUP BY Odl_ID:将同一Odl_ID的所有分散行合并为一行,完成信息整合。

结果验证

执行这个语句后,生成的consolidated_events视图会完全匹配你想要的结构:

  • Odl_ID=1的行整合了Start、Finish、两个Generate PDF事件的所有字段
  • Odl_ID=2的行同理,完美对应目标数据

如果某个Odl_ID缺少某类事件(比如没有Generate PDF 2),对应的字段会显示NULL,符合数据逻辑。

内容的提问来源于stack exchange,提问作者alessandro.todisco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 03:47:36