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 分析查询计划,优化查询。没有搜到相关的文章