mysql分组查询每组最新的一条数据

代码示例:
在mysql中,获取每个分组的最新一条数据是一个常见的查询需求。
以下是五种实现该需求的方法:
1.使用子查询和join
通过子查询先找出每个分组的最新记录的日期,然后通过join操作连接原表来获取完整的记录。
select o.*
from orders o
inner join (
select customer_id, max(order_date) as latest_date
from orders
group by customer_id
) latest_orders on o.customer_id = latest_orders.customer_id and o.order_date = latest_orders.latest_date;
2.使用窗口函数(mysql 8.0+)
如果你使用的是mysql 8.0或更高版本,可以利用窗口函数row_number()来实现。
select *
from (
select *,
row_number() over (partition by customer_id order by order_date desc) as rn
from orders
) ranked_orders
where rn = 1;
3.使用变量(不推荐)
虽然不推荐使用变量来处理这类问题,但作为一种可能的方法,可以通过自连接和变量来实现。
select t1.* from orders t1 left join orders t2 on t1.customer_id = t2.customer_id and t1.order_date < t2.order_date where t2.customer_id is null;
4.通过聚合函数和子查询
使用聚合函数max()来获取每个分组的最新时间,然后通过子查询来获取对应的完整记录。
select *
from orders
where (customer_id, order_date) in (
select customer_id, max(order_date)
from orders
group by customer_id
);
5.通过distinct关键字
通过在子查询中使用distinct关键字来打破mysql语句优化,使排序生效。
select *
from (
select distinct * from orders order by customer_id, order_date desc
) as latest
group by customer_id;
以上方法中,推荐使用子查询和join操作或者窗口函数,这些方法更清晰、效率更高。
使用变量的方法虽然可行,但通常不是最佳实践。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论