TypechoJoeTheme

至尊技术网

统计
登录
用户名
密码

SQL查询技巧:如何获取唯一记录的最低价格数据

2026-04-22
/
0 评论
/
7 阅读
/
正在检测是否收录...
04/22

标题:SQL查询实战:如何高效获取唯一记录的最低价格数据
关键词:SQL查询、唯一记录、最低价格、GROUP BY、窗口函数、数据库优化
描述:本文详细讲解在SQL中获取唯一记录最低价格的多种实用技巧,包括GROUP BY、DISTINCT ON和窗口函数的使用方法,并提供性能优化建议。

正文:

在电商系统、价格比对平台等场景中,经常需要从海量数据中提取每个商品的唯一最低价记录。这种需求看似简单,但若处理不当,可能导致查询性能低下甚至错误结果。下面介绍5种经过实战检验的高效解决方案。

方法1:经典GROUP BY方案

最基础的实现方式是通过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;

方法2:DISTINCT ON(PostgreSQL特有)

PostgreSQL提供了更简洁的语法:


SELECT DISTINCT ON (product_id) *
FROM products
ORDER BY product_id, price ASC;

注意:当同一商品存在多条相同最低价记录时,此方法会随机返回其中一条。

方法3:窗口函数进阶版

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;

方法4:使用EXISTS避免重复

对于不支持窗口函数的旧版数据库,可采用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
);

性能优化关键点

  1. 为product_id和price建立复合索引
  2. 大数据表优先使用窗口函数方案
  3. MySQL中可考虑使用LIMIT优化:

SELECT *
FROM products
WHERE (product_id, price) IN (
    SELECT product_id, MIN(price)
    FROM products
    GROUP BY product_id
);
朗读
赞(0)
版权属于:

至尊技术网

本文链接:

https://www.zzwws.cn/archives/44043/(转载时请注明本文出处及文章链接)

评论 (0)
38,288 文章数
92 评论量

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月