MySQL中如何按date_post分组筛选date_complete最新的行?
按date_post分组筛选每组最新date_complete的所有行(MySQL实现)
我有一张data表,原始数据如下:
| date_post | date_complete |
|---|---|
| 2023-11-28 | 2023-12-04 |
| 2023-11-28 | 2023-12-04 |
| 2023-11-28 | 2023-12-05 |
| 2023-11-28 | 2023-12-05 |
| 2023-11-29 | 2023-12-06 |
| 2023-11-29 | 2023-12-06 |
| 2023-11-29 | 2023-12-07 |
| 2023-11-29 | 2023-12-07 |
需要筛选出按date_post分组后,每组中date_complete值最新的所有行,目标结果如下:
| date_post | date_complete |
|---|---|
| 2023-11-28 | 2023-12-05 |
| 2023-11-28 | 2023-12-05 |
| 2023-11-29 | 2023-12-07 |
| 2023-11-29 | 2023-12-07 |
这个需求完全可以实现,下面提供两种实用的MySQL实现方法:
方法一:子查询关联法(兼容所有MySQL版本)
SELECT d.* FROM data d INNER JOIN ( SELECT date_post, MAX(date_complete) AS latest_complete FROM data GROUP BY date_post ) t ON d.date_post = t.date_post AND d.date_complete = t.latest_complete;
逻辑:先通过子查询按date_post分组,计算出每组的最大date_complete值;再将原表与子查询结果关联,筛选出匹配分组且完成日期等于组内最大值的所有行。
方法二:窗口函数法(MySQL 8.0及以上版本适用)
如果你的MySQL版本是8.0或更高,用窗口函数会更简洁直观:
SELECT date_post, date_complete FROM ( SELECT date_post, date_complete, RANK() OVER (PARTITION BY date_post ORDER BY date_complete DESC) AS rnk FROM data ) t WHERE rnk = 1;
逻辑:用PARTITION BY date_post按发布日期分组,ORDER BY date_complete DESC给每组内的行按完成日期倒序排名;排名为1的就是每组最新的行,直接筛选即可。
内容的提问来源于stack exchange,提问作者Cristino
相关产品推荐
相关产品推荐

