SQL如何查询特定列值相同、其他指定列值不同的行记录
同产品同价格对应多售卖数量记录的SQL筛选方案
需求说明
- 待查询数据表为
Goods,包含三个字段:Product(产品)、Quantity(售卖数量)、Price(价格) - 筛选目标:返回所有同一产品维度下,相同价格对应至少2个不同售卖数量的原始记录
- 排除范围:同一产品下,某价格仅对应唯一售卖数量的记录不返回
可直接复用的SQL写法
写法1:窗口函数实现(推荐,适配支持窗口函数的数据库:MySQL8.0+、PostgreSQL、SQL Server、Hive等)
SELECT Product, Quantity, Price FROM ( SELECT *, COUNT(DISTINCT Quantity) OVER (PARTITION BY Product, Price) AS match_flag FROM Goods ) tmp WHERE match_flag >= 2;
逻辑说明:通过PARTITION BY Product, Price将数据按「同产品+同价格」分组,统计每个分组内不同售卖数量的个数,只要个数≥2就满足筛选条件,直接返回对应分组下的所有行即可。
写法2:子查询关联实现(适配不支持窗口函数的老版本数据库,如MySQL5.x)
SELECT g.* FROM Goods g INNER JOIN ( SELECT Product, Price FROM Goods GROUP BY Product, Price HAVING COUNT(DISTINCT Quantity) >= 2 ) match_group ON g.Product = match_group.Product AND g.Price = match_group.Price;
逻辑说明:先通过GROUP BY聚合找出所有符合「同产品同价格下对应至少2个不同售卖数量」的(Product, Price)组合,再通过内连接关联原表,取出这些组合对应的全部原始记录,查询结果和窗口函数写法完全一致。
优化提示:如果表中不存在
Product、Price、Quantity三个字段完全重复的冗余录入数据,可以把语句里的COUNT(DISTINCT Quantity)替换为COUNT(*),能进一步提升查询效率。
内容的提问来源于stack exchange,提问作者user19497099
相关产品推荐
相关产品推荐

