PostgreSQL如何按client_id、Version分组获取对应最新日期记录
解决方案
通过聚合函数MAX()取分组内的最新日期即可,不需要将日期字段加入GROUP BY子句。
原有写法的问题
- 把
Date加入GROUP BY时,分组粒度会变成「client_id + Version + 单日日期」,每个日期会单独生成一个分组,最终返回所有日期的记录,无法得到单组最新值。 - 把
Date从GROUP BY中移除但不做聚合处理时,数据库无法确定要返回组内哪一条日期记录,会触发语法报错,这是SQL的标准语法约束。
正确SQL语句
从你写的NOW()::DATE语法判断你用的是PostgreSQL,以下语句自动查询近12个月数据,返回结果和你给出的示例结构完全匹配:
SELECT client_id, Version, MAX(Date) AS "LATEST Date" FROM db_table WHERE Date >= CURRENT_DATE - INTERVAL '12 months' AND Date < CURRENT_DATE GROUP BY client_id, Version ORDER BY client_id, Version;
适配说明
- 如果使用MySQL,将WHERE中的日期条件替换为
Date >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH)即可,其余逻辑不变。 - 如果需要固定查询时间范围,直接替换WHERE里的日期条件为你需要的起止值即可,聚合逻辑不需要调整。
内容的提问来源于stack exchange,提问作者Sergey
相关产品推荐
相关产品推荐

