如何在GROUP BY中对MIN聚合的列添加过滤?(LeetCode1321)
解决LeetCode 1321. Restaurant Growth的日期过滤问题
你的现有SQL已经正确计算出每个日期对应的7天累计金额和平均金额,现在需要筛选出比所有访问日期最小值晚6天及之后的日期(对应原题要求从第7天开始输出结果)。你之前的HAVING语句失效,是因为GROUP BY B.visited_on后,MIN(visited_on)取的是每个分组内的最小值(也就是当前的B.visited_on本身),而非全局最早的访问日期。
只需在GROUP BY之后、ORDER BY之前添加以下HAVING条件即可:
HAVING B.visited_on >= (SELECT DATE_ADD(MIN(visited_on), INTERVAL 6 DAY) FROM Customer)
修改后的完整SQL如下:
SELECT B.visited_on AS visited_on , SUM(A.amount) AS amount , ROUND(AVG(A.amount),2) AS average_amount FROM (SELECT visited_on , SUM(amount) AS amount FROM Customer GROUP BY visited_on) A JOIN (SELECT DISTINCT visited_on FROM Customer) B ON DATEDIFF(B.visited_on , A.visited_on) <= 6 AND B.visited_on >= A.visited_on GROUP BY B.visited_on HAVING B.visited_on >= (SELECT DATE_ADD(MIN(visited_on), INTERVAL 6 DAY) FROM Customer) ORDER BY B.visited_on ASC
逻辑说明
- 子查询
(SELECT DATE_ADD(MIN(visited_on), INTERVAL 6 DAY) FROM Customer)会计算出全局最早访问日期往后推6天的日期 HAVING条件确保只保留这个日期及之后的记录,正好对应需要展示的7天窗口起始日期
内容的提问来源于stack exchange,提问作者Gravity Boy
相关产品推荐
相关产品推荐

