悠悠楠杉
网站页面
标题:SQL查询实战:如何高效获取唯一记录的最低价格数据
关键词:SQL查询、唯一记录、最低价格、GROUP BY、窗口函数、数据库优化
描述:本文详细讲解在SQL中获取唯一记录最低价格的多种实用技巧,包括GROUP BY、DISTINCT ON和窗口函数的使用方法,并提供性能优化建议。
正文:
在电商系统、价格比对平台等场景中,经常需要从海量数据中提取每个商品的唯一最低价记录。这种需求看似简单,但若处理不当,可能导致查询性能低下甚至错误结果。下面介绍5种经过实战检验的高效解决方案。
最基础的实现方式是通过GROUP BY分组后取最小值:
SELECT product_id, MIN(price) AS min_price
FROM products
GROUP BY product_id;
但这种方法只能返回ID和价格,如果需要完整记录,需结合子查询:
SELECT p.*
FROM products p
JOIN (
SELECT product_id, MIN(price) AS min_price
FROM products
GROUP BY product_id
) tmp ON p.product_id = tmp.product_id AND p.price = tmp.min_price;
PostgreSQL提供了更简洁的语法:
SELECT DISTINCT ON (product_id) *
FROM products
ORDER BY product_id, price ASC;
注意:当同一商品存在多条相同最低价记录时,此方法会随机返回其中一条。
ROW_NUMBER()窗口函数能精准控制返回结果:
WITH ranked_products AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY price ASC) AS rn
FROM products
)
SELECT product_id, price, ...其他字段
FROM ranked_products
WHERE rn = 1;
对于不支持窗口函数的旧版数据库,可采用EXISTS方案:
SELECT p1.*
FROM products p1
WHERE NOT EXISTS (
SELECT 1 FROM products p2
WHERE p2.product_id = p1.product_id AND p2.price < p1.price
);
SELECT *
FROM products
WHERE (product_id, price) IN (
SELECT product_id, MIN(price)
FROM products
GROUP BY product_id
);