SQL按ID分组取最大日期 兼容完成日期为空场景实现方法
需求梳理
- 原表结构参考:

- 目标输出参考:

- 聚合规则:
- 按
ID字段分组 - 所有分组均返回组内最大
created date(创建日期) - 组内存在任意
completed date(完成日期)为空的记录时,完成日期字段返回空 - 组内所有记录完成日期均非空时,返回组内最大完成日期
- 按
- 现存问题:基础
GROUP BY聚合无法实现「存在空完成日期时不返回最大完成日期」的分支判断逻辑
SQL实现方案
核心逻辑是先通过条件计数判断分组内是否存在空完成日期,再按规则返回对应值,通用写法兼容绝大多数SQL数据库:
SELECT ID, MAX(created_date) AS max_created_date, CASE WHEN COUNT(CASE WHEN completed_date IS NULL THEN 1 END) > 0 THEN NULL ELSE MAX(completed_date) END AS max_completed_date -- 替换为实际业务表名 FROM target_table GROUP BY ID;
注意:执行前请将SQL中的target_table替换为实际使用的数据表名,字段名如果和实际命名有差异也请同步调整
逻辑说明
- 内层嵌套的
CASE语句会在记录的完成日期为空时返回标记值1,非空时返回NULL COUNT函数仅统计非NULL值,计数大于0即代表当前分组存在完成日期为空的记录,此时完成日期字段直接返回NULL- 计数为0代表组内无空完成日期记录,正常返回组内最大完成日期即可
若使用PostgreSQL、MySQL 8.0+等支持布尔聚合函数的数据库,空值存在判断可以简化为
BOOL_OR(completed_date IS NULL),写法更精简。
内容的提问来源于stack exchange,提问作者DATAMART
相关产品推荐
相关产品推荐

