如何用BigQuery SQL筛选所有SKU状态均为SpecialOrder的产品
问题描述
现有一张包含Product_ID、SKU_ID、Status字段的表,其中SKU是产品的子项(例如T恤产品的不同颜色对应不同SKU),表数据如下:
Product_ID, SKU_ID, Status 1 1 InStock 1 2 SpecialOrder 2 3 SpecialOrder 2 4 SpecialOrder 3 5 InStock
需求为:找出所有SKU的Status均为SpecialOrder的产品(示例中仅产品2符合)。
目前已通过WITH子句创建仅包含Status='SpecialOrder'数据的表别名并关联主表,得到如下中间结果,但不知如何完成最终筛选,或想确认当前思路是否可行:
Product_ID, SKU_ID, Status, Product_ID, SKU_ID, Status null, null, null 1 1 InStock 1 2 SpecialOrder 1 2 SpecialOrder 2 3 SpecialOrder 2 3 SpecialOrder 2 4 SpecialOrder 2 4 SpecialOrder null, null, null, 3 5 InStock
解决方案
你的思路方向没问题,但可以更简洁。给你两种靠谱的实现方法:
方法一:分组直接筛选
直接按Product_ID分组,筛选出该产品下没有非SpecialOrder状态的SKU即可:
SELECT Product_ID FROM your_table_name GROUP BY Product_ID HAVING COUNT(CASE WHEN Status != 'SpecialOrder' THEN 1 END) = 0;
原理很简单:用CASE语句统计每个产品里状态不是SpecialOrder的SKU数量,数量为0就说明这个产品的所有SKU都是SpecialOrder。
方法二:基于你的现有思路优化
如果想继续用WITH子句的思路,可以这么调整:
- 先统计每个产品的总SKU数
- 再统计每个产品里状态为
SpecialOrder的SKU数 - 筛选两者数量相等的产品
WITH special_sku AS ( SELECT Product_ID, COUNT(SKU_ID) AS special_count FROM your_table_name WHERE Status = 'SpecialOrder' GROUP BY Product_ID ), total_sku AS ( SELECT Product_ID, COUNT(SKU_ID) AS total_count FROM your_table_name GROUP BY Product_ID ) SELECT s.Product_ID FROM special_sku s JOIN total_sku t ON s.Product_ID = t.Product_ID WHERE s.special_count = t.total_count;
这种方式和你的初始思路兼容,只是调整了关联后的筛选逻辑,同样能精准找出目标产品。
关于你当前的中间结果
你现在的关联(应该是左连接)产生了带null的行,这些行对应主表中存在但special_sku表没有的SKU。如果非要基于这个结果筛选,可以找那些Product_ID对应的所有行里,左表的Product_ID没有null的产品——但这种方法效率不如上面两种,因为要处理更多冗余数据,不推荐。
内容的提问来源于stack exchange,提问作者David Bevan
相关产品推荐
相关产品推荐

