-- 假设我们有一个名为 `orders` 的表,包含以下字段:
-- id: 订单ID (主键)
-- customer_id: 客户ID
-- order_date: 订单日期
-- amount: 订单金额
-- 目标:按客户分组,获取每个客户的最新一条订单记录
-- 方法1:使用窗口函数 ROW_NUMBER()
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date DESC) AS rn
FROM orders
) t
WHERE rn = 1;
-- 解释:
-- 1. 使用窗口函数 ROW_NUMBER() 按 customer_id 分组,并按 order_date 降序排列。
-- 2. 对每个分组的第一条记录(即最新的订单)赋予 rn = 1。
-- 3. 最后通过 WHERE rn = 1 筛选出每组最新的订单。
-- 方法2:使用子查询和 JOIN
SELECT o1.*
FROM orders o1
JOIN (
SELECT customer_id, MAX(order_date) AS max_order_date
FROM orders
GROUP BY customer_id
) o2 ON o1.customer_id = o2.customer_id AND o1.order_date = o2.max_order_date;
-- 解释:
-- 1. 子查询获取每个客户最新的订单日期。
-- 2. 主查询通过 JOIN 将子查询结果与原表关联,获取完整的订单信息。
上一篇:mysql删除重复项只保留一条
下一篇:mysql 行锁
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站