在Snowflake中基于城市内产品的厂商供应情况添加标识字段
在Snowflake数据表中添加Flag标识字段的实现方案
需求规则
- 同一城市+产品组合下,同时由厂商1和厂商2供应 → 标识为
man_1_2 - 同一城市+产品组合下,仅由厂商1供应 → 标识为
man_1 - 同一城市+产品组合下,仅由厂商2供应 → 标识为
man_2
实现方案
方案1:使用窗口函数直接计算
利用Snowflake窗口函数特性,无需预聚合即可为每行生成目标标识,执行效率较高:
SELECT City, Product, Manufacturer, CASE -- 分组内存在两个不同供应商时标记 WHEN COUNT(DISTINCT Manufacturer) OVER (PARTITION BY City, Product) = 2 THEN 'man_1_2' -- 分组内仅存在厂商1时标记 WHEN MAX(Manufacturer) OVER (PARTITION BY City, Product) = 1 THEN 'man_1' -- 剩余情况即为仅厂商2供应 ELSE 'man_2' END AS Flag FROM your_table_name;
方案2:先聚合再关联
先通过分组聚合得到每个城市+产品对应的标识,再关联回原表,逻辑更直观易懂:
WITH product_supplier_flags AS ( SELECT City, Product, CASE WHEN COUNT(DISTINCT Manufacturer) = 2 THEN 'man_1_2' WHEN MAX(Manufacturer) = 1 THEN 'man_1' ELSE 'man_2' END AS Flag FROM your_table_name GROUP BY City, Product ) SELECT t.City, t.Product, t.Manufacturer, psf.Flag FROM your_table_name t JOIN product_supplier_flags psf ON t.City = psf.City AND t.Product = psf.Product;
验证说明
以你提供的示例数据为例:
- City=1、Product=3的分组下包含厂商1和2,所有行Flag为
man_1_2 - City=2、Product=6的分组下仅存在厂商1,所有行Flag为
man_1 - City=1、Product=2仅厂商1供应,Flag为
man_1;Product=4仅厂商2供应,Flag为man_2
完全匹配需求规则。
内容的提问来源于stack exchange,提问作者ExelIQ
相关产品推荐
相关产品推荐

