查询同产品描述下价格无变动的所有产品ID
查询同产品描述下价格无变动的所有产品ID
嘿,我完全get到你的需求了——就是要找出那些同一个产品描述下所有记录价格都完全一致的产品ID对吧?比如你举的例子里,所有Apple对应的ProductID都要返回,而Pear因为有不同价格就排除掉,没问题,咱们来搞定它~
核心思路
先找出所有满足「同ProductDesc下Price唯一」的产品描述,再把这些描述对应的所有ProductID捞出来就行,这里给你两种常用的实现方式:
方法一:分组筛选+关联查询(通用SQL,几乎所有数据库都支持)
这种方法先通过子查询筛选出符合条件的产品描述,再关联原表获取对应的ID:
SELECT pt.ProductID FROM ProductsTable pt INNER JOIN ( -- 筛选出所有只有一种价格的产品描述 SELECT ProductDesc FROM ProductsTable GROUP BY ProductDesc HAVING COUNT(DISTINCT Price) = 1 ) AS ValidDescs ON pt.ProductDesc = ValidDescs.ProductDesc;
解释:子查询里用GROUP BY ProductDesc把同描述的记录归为一组,HAVING COUNT(DISTINCT Price) = 1确保这个组里的价格去重后只有1个(也就是所有价格都一样),之后关联原表就能拿到所有符合要求的ProductID了。
方法二:窗口函数实现(适合支持窗口函数的数据库,如MySQL8+、SQL Server、PostgreSQL等)
这种写法更直观,用窗口函数直接计算每个产品描述下的价格种类数,再筛选:
SELECT ProductID FROM ( SELECT ProductID, ProductDesc, -- 按产品描述分组,计算组内不同价格的数量 COUNT(DISTINCT Price) OVER(PARTITION BY ProductDesc) AS PriceCount FROM ProductsTable ) AS PriceCheck WHERE PriceCount = 1;
解释:窗口函数COUNT(DISTINCT Price) OVER(PARTITION BY ProductDesc)会给每一行标记出它所属产品描述下的价格种类数,最后只筛选出种类数为1的行,对应的就是价格无变动的产品ID。
拿你给的测试数据来验证的话,Apple对应的PriceCount是1,所以所有Apple的ID都会被选中;Pear的PriceCount是2,就会被排除,完全符合你的需求~
备注:内容来源于stack exchange,提问作者UhhhhhIdk
相关产品推荐
相关产品推荐

