SQL查询:获取每个analysisId对应的最大timestamp值
获取每个analysisId对应的最大timestamp值
需求说明
表myData包含timestamp(实际场景唯一)、analysisId及其他列,多条记录可共享同一analysisId但对应不同timestamp,需要查询每个analysisId对应的最大timestamp值。
示例数据
timestamp | analysisId 1234 | 1 1236 | 1 1300 | 2 1337 | 3 1400 | 3
期望结果
timestamp | analysisId 1236 | 1 1300 | 2 1400 | 3
原查询问题分析
你当前使用的查询:
SELECT "timestamp", analysisId FROM myData GROUP BY (analysisId, "timestamp") ORDER BY "timestamp" DESC LIMIT 1;
错误原因:
GROUP BY (analysisId, "timestamp")会将每一组唯一的(analysisId, timestamp)组合作为独立分组,最终分组结果和原表行数一致LIMIT 1仅返回排序后的第一行,因此只能得到一条结果,无法覆盖所有analysisId
正确解决方案
方案1:GROUP BY + 聚合函数(仅需timestamp和analysisId时推荐)
通过GROUP BY按analysisId分组,使用MAX()函数提取每组的最大timestamp:
SELECT analysisId, MAX("timestamp") AS "timestamp" FROM myData GROUP BY analysisId;
这个方法简洁高效,直接满足仅获取analysisId和对应最大timestamp的需求。
方案2:窗口函数(需返回其他列时推荐)
如果需要同时返回该记录的其他列,可使用ROW_NUMBER()窗口函数:
SELECT "timestamp", analysisId -- 此处可添加其他需要的列 FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY analysisId ORDER BY "timestamp" DESC) AS rn FROM myData ) t WHERE rn = 1;
PARTITION BY analysisId将数据按analysisId分区ORDER BY "timestamp" DESC使每个分区内最新的记录排在第一位ROW_NUMBER()为每个分区的行编号,取rn=1即可得到每个analysisId对应最大timestamp的完整记录
内容的提问来源于stack exchange,提问作者Madden
相关产品推荐
相关产品推荐

