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;
语句细节解释
ROW_NUMBER() OVER (ORDER BY Odl_ID):生成目标视图里的自增ID,按Odl_ID排序,完全匹配你给出的目标结构。MAX(CASE ...):针对每个字段,只在对应事件类型的行中提取有效值,其他行返回NULL;MAX函数会自动忽略NULL,只保留对应事件的有效数据。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
相关产品推荐
相关产品推荐

