MySQL如何按ID分组查询每个ID晚于当前日期的最近两条日期数据
解决方案
方式1:MySQL 8.0及以上版本(推荐)
用窗口函数ROW_NUMBER()给同ID下符合日期条件的记录按日期升序排序,取排序值小于等于2的即可:
SELECT eDate, ID FROM ( SELECT eDate, ID, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY eDate ASC) AS rn FROM myTable WHERE ID IN (1,3) AND eDate >= CURDATE() ) t WHERE rn <= 2 ORDER BY ID, eDate;
如果需要保留调试用的eCount字段,直接把rn别名改成eCount即可。
方式2:MySQL 5.x及更低版本(无窗口函数支持)
用关联子查询的方式实现分组取Top N:
SELECT t1.eDate, t1.ID, COUNT(*) AS eCount FROM myTable t1 INNER JOIN myTable t2 ON t1.ID = t2.ID AND t2.eDate >= CURDATE() AND t2.eDate <= t1.eDate WHERE t1.ID IN (1,3) AND t1.eDate >= CURDATE() GROUP BY t1.ID, t1.eDate HAVING COUNT(*) <= 2 ORDER BY t1.ID, t1.eDate;
你之前的写法出错的核心原因是:GROUP BY ID,eDate会把每个ID+日期的组合单独作为一组,每组的COUNT统计值天然都是1,所以HAVING条件过滤不掉任何符合日期要求的记录,最终会返回全部匹配结果。
内容的提问来源于stack exchange,提问作者rolinger
相关产品推荐
相关产品推荐

