如何在SQL中查询每个产品组的最小尺码产品?
如何查询每个产品组中尺码最小的产品?
嘿,这个需求其实很常见,咱们可以用几种不同的SQL写法来实现,我给你拆解一下:
方法一:用窗口函数(推荐,简洁高效)
这是现代SQL里最常用的方式,逻辑清晰还高效。核心思路是先把产品表和尺码编码表关联,给每个组的产品按尺码大小排个序,然后挑出每个组里排第一的那条记录。
SELECT Group_id, Product_id, Size FROM ( SELECT p.Group_id, p.Product_id, p.Size, -- 按产品组分隔,每个组内按尺码编码从小到大排序,标记行号 ROW_NUMBER() OVER (PARTITION BY p.Group_id ORDER BY sc.Size_code ASC) AS rn FROM Product p -- 关联尺码编码表,拿到每个尺码对应的大小编码 JOIN Size_Code sc ON p.Size = sc.Size ) ranked -- 只取每个组里排第一的记录 WHERE rn = 1;
补充说明:
如果同一个产品组里有多个产品的尺码都是最小的(比如Group A有两个s尺码的产品),ROW_NUMBER()只会返回其中一个。要是想把所有符合条件的产品都列出来,把ROW_NUMBER()换成RANK()或者DENSE_RANK()就可以啦。
方法二:用子查询(兼容旧版SQL)
要是你用的数据库不支持窗口函数(比如一些老版本的MySQL),可以用这种子查询的方式:
SELECT p.Group_id, p.Product_id, p.Size FROM Product p JOIN Size_Code sc ON p.Size = sc.Size -- 筛选出当前产品组里尺码编码最小的记录 WHERE sc.Size_code = ( SELECT MIN(sc_inner.Size_code) FROM Product p_inner JOIN Size_Code sc_inner ON p_inner.Size = sc_inner.Size WHERE p_inner.Group_id = p.Group_id );
补充说明:
这种写法会返回同一个组里所有尺码最小的产品,只要它们的尺码编码等于组内最小值,都会被列出来。
内容的提问来源于stack exchange,提问作者Kath
相关产品推荐
相关产品推荐

