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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:30:42