SQL如何按相同some-id分组将两行timestamp转为对应两列返回
这个需求完全可以通过SQL实现,根据场景不同有两种常用实现方案:
方案1:分组聚合(适用单个some-id固定只有2条时间记录的场景)
直接按some-id分组,用聚合函数取最小、最大时间对应两列即可:
SELECT `some-id`, MIN(`timestamp`) AS timestamp_a, MAX(`timestamp`) AS timestamp_b FROM 你的表名 GROUP BY `some-id`;
方案2:窗口函数+行转列(适用需要按顺序取指定位次时间、或未来可能扩展多列的场景)
先给同个some-id下的时间按顺序编号,再通过条件聚合转成多列:
WITH ranked_time AS ( SELECT `some-id`, `timestamp`, -- 同个some-id下按时间升序排序编号 ROW_NUMBER() OVER (PARTITION BY `some-id` ORDER BY `timestamp`) AS rank_num FROM 你的表名 ) SELECT `some-id`, MAX(CASE WHEN rank_num = 1 THEN `timestamp` END) AS timestamp_a, MAX(CASE WHEN rank_num = 2 THEN `timestamp` END) AS timestamp_b FROM ranked_time GROUP BY `some-id`;
如果单个some-id下的时间记录超过2条,只需要增加对应rank_num的CASE分支,就能生成更多列的时间字段。
内容的提问来源于stack exchange,提问作者damombz
相关产品推荐
相关产品推荐

