使用Min/Max取起止日期时如何正确保留最晚日期空值
问题说明
数据处理规则如下:
- 取分组内最早日期作为
Start date(开始日期) - 分组内存在有效最晚日期时,将该值设为
end date(结束日期) - 分组内日期字段存在空值时,代表对应人员仍处于激活状态,结束日期需保留空值
直接对日期字段使用Min()、Max()聚合函数实现时,日期为空的场景下无法正确返回空值的结束日期——聚合函数默认会自动跳过空值,会错误返回组内现存的最大日期,和需求不符。
解决方法
核心逻辑调整:不要直接对日期字段取最大值,先判断同组内是否存在空日期记录,存在则直接返回空作为结束日期,不存在时再计算组内最大日期。
不同场景参考代码:
SQL 实现
SELECT user_id, MIN(date_col) AS `Start date`, CASE WHEN SUM(CASE WHEN date_col IS NULL THEN 1 ELSE 0 END) > 0 THEN NULL ELSE MAX(date_col) END AS `end date` FROM source_table GROUP BY user_id;
DAX(Power BI/Excel 数据模型)实现
end date = IF( COUNTBLANK('source_table'[date_col]) > 0, BLANK(), MAX('source_table'[date_col]) )
Pandas(Python)实现
import pandas as pd # 按人员分组计算开始日期 res = df.groupby('user_id', as_index=False).agg( **{'Start date': ('date_col', 'min')} ) # 单独计算结束日期:组内有空值则返回空,否则取最大日期 res['end date'] = res['user_id'].map( df.groupby('user_id')['date_col'].apply(lambda x: None if x.isna().any() else x.max()) )
内容的提问来源于stack exchange,提问作者Ashok
相关产品推荐
相关产品推荐

