MySQL 分组取每组第一条数据通常涉及到 GROUP BY
和窗口函数(如 ROW_NUMBER()
)的使用。GROUP BY
用于将数据分组,而窗口函数可以在每个分组内进行排序并选择特定行的数据。
MIN()
或 MAX()
等聚合函数结合条件来实现。ROW_NUMBER()
或 RANK()
等窗口函数来实现。假设我们有一个 orders
表,结构如下:
CREATE TABLE orders (
id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
amount DECIMAL(10, 2)
);
我们希望按 customer_id
分组,取每个客户的第一个订单。
SELECT
customer_id,
MIN(order_date) AS first_order_date,
MIN(id) AS first_order_id
FROM
orders
GROUP BY
customer_id;
WITH ranked_orders AS (
SELECT
customer_id,
order_date,
id,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date) AS rn
FROM
orders
)
SELECT
customer_id,
order_date AS first_order_date,
id AS first_order_id
FROM
ranked_orders
WHERE
rn = 1;
原因:聚合函数只能返回每组的汇总信息,而窗口函数可以在每组内进行排序并选择特定行的数据。
解决方法:使用窗口函数 ROW_NUMBER()
或 RANK()
可以更灵活地选择每组的第一条数据。
原因:窗口函数可能会增加查询的复杂度,尤其是在大数据集上,可能会导致性能下降。
解决方法:
EXPLAIN
分析查询计划,优化查询。领取专属 10元无门槛券
手把手带您无忧上云