SQL透视含重复ID的表:按ID获取各事件最早时间的方法
修正后的SQL语句实现需求
原SQL的核心问题是分组逻辑错误:row_number() over(partition by event order by time)是全局按Event生成行号,而非按每个ID+Event组合分组,导致后续过滤line=1仅保留了每个Event全局最早的单条记录,完全偏离了"每个ID下各Event最早时间"的需求。
以下是两种正确的实现方式:
方法1:先聚合再透视
先按ID和Event分组,提取每个组合的最早时间,再将Event字段透视成列:
SELECT id, a, b, c FROM ( -- 先获取每个ID+Event的最早时间 SELECT id, event, MIN(time) AS earliest_time FROM your_table GROUP BY id, event ) PIVOT ( -- 透视时取聚合后的时间(每个分组仅一条记录,MIN/MAX效果一致) MIN(earliest_time) FOR event IN ('a' AS a, 'b' AS b, 'c' AS c) ) ORDER BY id;
方法2:直接透视(更简洁)
利用PIVOT的自动分组特性,以ID为分组键,直接对每个ID下的Event取最早时间:
SELECT id, a, b, c FROM your_table PIVOT ( MIN(time) FOR event IN ('a' AS a, 'b' AS b, 'c' AS c) ) ORDER BY id;
结果说明
执行上述语句后,会得到符合预期的结果:
- 每个ID单独一行,对应各Event列的数值为该ID下该Event的最早出现时间
- 若某ID无对应Event记录,对应列显示NULL(比如ID4的a、b列会为NULL,c列显示
10:00 PM)
内容的提问来源于stack exchange,提问作者phanalyst
相关产品推荐
相关产品推荐

