禁用GROUP BY/DISTINCT时,如何查询指定日期前各活动的最新状态?
解决方案
可以利用NOT EXISTS子查询配合WHERE子句实现需求,核心逻辑是:筛选出指定日期前的所有记录,同时确保当前记录是对应活动在该日期范围内的最新记录(即不存在同活动、同日期范围但日期更大的记录)。
对应的SQL语句如下(假设表名为activity_tracking):
SELECT a.* FROM activity_tracking a WHERE a.Date <= '9月11日' AND NOT EXISTS ( SELECT 1 FROM activity_tracking b WHERE b.Activity = a.Activity AND b.Date <= '9月11日' AND b.Date > a.Date )
逻辑说明
- 外层查询先筛选出所有
Date <= '9月11日'的记录; - 内层子查询检查:对于当前记录的活动,是否存在另一条记录满足同活动、日期不晚于9月11日且日期比当前记录更大;
- 通过
NOT EXISTS排除掉那些存在更晚记录的条目,最终剩下的就是每个活动在指定日期前的最新状态记录。
验证原始数据
- 对于Activity 100:9月10日的记录,子查询找不到同活动、日期<=11日且比10日大的记录(9月12日超过11日,不满足条件),因此这条记录被保留;
- 对于Activity 110:9月9日的记录,子查询找不到同活动、日期<=11日且比9日大的记录(9月12日超过11日),因此这条记录被保留;而9月8日的记录会被排除,因为存在9月9日的同活动记录日期更大。
最终输出结果完全符合期望。
内容的提问来源于stack exchange,提问作者userav
相关产品推荐
相关产品推荐

