使用DATEADD函数时如何按条件选取分组内最新插入的NUM_DAY值
实现方案
方案1:使用窗口函数(兼容绝大多数主流SQL引擎,如MySQL 8.0+、PostgreSQL、Spark SQL等)
先通过ROW_NUMBER()窗口函数对每个number_id下的记录按added_timestap倒序排序,取排序为1的最新记录,再执行日期计算:
WITH ranked_records AS ( SELECT number_id, NUM_DAY, MY_DATETIME, ROW_NUMBER() OVER (PARTITION BY number_id ORDER BY added_timestap DESC) AS rn FROM TBL1 ) SELECT number_id, DATEADD('days', NUM_DAY, MY_DATETIME) AS LAST_DATETIME FROM ranked_records WHERE rn = 1;
方案2:子查询关联(兼容不支持窗口函数的低版本数据库,如MySQL 5.x)
先通过分组查询拿到每个number_id对应的最新added_timestap,再关联原表获取对应记录的字段值后计算:
SELECT t.number_id, DATEADD('days', t.NUM_DAY, t.MY_DATETIME) AS LAST_DATETIME FROM TBL1 t INNER JOIN ( SELECT number_id, MAX(added_timestap) AS latest_ts FROM TBL1 GROUP BY number_id ) latest ON t.number_id = latest.number_id AND t.added_timestap = latest.latest_ts;
补充说明
- 如果同一个
number_id存在多条added_timestap完全相同的最新记录,方案1的ROW_NUMBER()会随机取其中一条,若需要保留所有匹配记录可将ROW_NUMBER()替换为RANK() - 若你的SQL方言中
DATEADD函数的参数顺序/格式有差异,可根据实际使用的数据库调整函数写法即可
内容的提问来源于stack exchange,提问作者lalaland
相关产品推荐
相关产品推荐

