- SQL查询:
WITH RankedOrders AS (
SELECT
order_id,
customer_id,
order_date,
total_amount,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date DESC) AS rn
FROM orders
)
SELECT
order_id,
customer_id,
order_date,
total_amount
FROM RankedOrders
WHERE rn = 1;
SELECT
order_id,
customer_id,
order_date,
total_amount
FROM (
SELECT
order_id,
customer_id,
order_date,
total_amount,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date DESC) AS rn
FROM orders
) RankedOrders
WHERE rn = 1;
WITH RankedOrders AS (
SELECT
order_id,
customer_id,
order_date,
total_amount,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date DESC) AS rn
FROM orders
)
SELECT
order_id,
customer_id,
order_date,
total_amount
FROM RankedOrders
WHERE rn = 1;
- 优化策略:
- 索引优化:
- 在
orders
表的customer_id
和order_date
列上创建复合索引,例如在MySQL中:CREATE INDEX idx_customer_date ON orders (customer_id, order_date DESC);
这样可以加速PARTITION BY
和ORDER BY
操作。
- 分区表:
- 如果数据量非常大,可以考虑对
orders
表按customer_id
或order_date
进行分区。例如按order_date
进行范围分区,将不同时间段的数据分布在不同的分区中,查询时可以快速定位到相关分区,减少扫描的数据量。
- 查询执行计划分析:
- 使用数据库自带的查询执行计划分析工具(如MySQL的
EXPLAIN
关键字),分析查询的执行计划,查看索引是否被正确使用,是否存在全表扫描等性能问题,根据分析结果进一步优化查询。