如何计算各分类最大last_updated与全局最大更新日期的天数差
实现方案
核心逻辑是通过两个不同的窗口函数分别获取全局最大更新日期、分类维度的最大更新日期,再做日期差计算即可,无需嵌套子查询,通用写法如下:
SELECT category, last_updated, -- 以下日期差逻辑可根据你使用的数据库类型调整 DATEDIFF( MAX(last_updated) OVER (), -- 不加PARTITION的窗口函数计算全表最大更新日期 MAX(last_updated) OVER (PARTITION BY category) -- 按category分区计算每个分类的最大更新日期 ) AS day_diff FROM 你的表名;
不同数据库的日期函数适配
- MySQL、Hive、Spark SQL:直接使用上面的
DATEDIFF写法即可,参数顺序为DATEDIFF(较晚日期, 较早日期),计算结果和你给出的预期值完全匹配 - PostgreSQL:调整为如下写法即可
SELECT category, last_updated, (MAX(last_updated) OVER () - MAX(last_updated) OVER (PARTITION BY category))::INTEGER AS day_diff FROM 你的表名; - SQL Server:调整为如下写法即可
SELECT category, last_updated, DATEDIFF(DAY, MAX(last_updated) OVER (PARTITION BY category), MAX(last_updated) OVER ()) AS day_diff FROM 你的表名;
结果验证
按你的测试数据计算:
全表最大last_updated为2021-08-26
- abc分类的最大更新日期为
2020-06-14,两个日期差值为438天 - def分类的最大更新日期和全局最大值一致,差值为0
- ghi分类的最大更新日期为
2020-08-25,差值为1天
完全匹配你给出的预期输出。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

