分区时的情况 - 组的同一列中具有两个特定值的组的返回值
Posted
技术标签:
【中文标题】分区时的情况 - 组的同一列中具有两个特定值的组的返回值【英文标题】:CASE WHEN PARTITION BY - Returning Value for Groups with Two Specific Values in Same Column Across Group 【发布时间】:2021-04-22 21:45:38 【问题描述】:正如标题所说,我无法返回在同一列中跨组具有两个特定值的组。
以下是数据示例:
Claim | Exposure | Product
1 1 B
1 2 C
2 1 B
2 2 D
我的目标本质上是创建第三列,指定索赔是否具有 Product = B 的任何风险和 Product = C 的任何风险(即“所有必需的存在”)。如果索赔缺少特定产品的曝光,我想返回“产品 C 缺失”之类的内容。
理想情况下会产生以下结果:
Claim | Exposure | Product | RequiredCheck
1 1 B All Required
1 2 C All Required
2 1 B Missing C
2 2 D Missing C
我尝试使用GROUP BY Claim HAVING Product = B and Product = C
,但这不起作用,因为检查是基于一组索赔中的同一列,我不一定想将我的结果限制为只有那些“所有必需”值。
我也尝试使用MAX(CASE WHEN Product = B and Product = C THEN 1 ELSE 0 END) PARTITION BY Claim)
,但这也不会返回任何结果,因为检查是基于同一列中的值。
我曾考虑将产品编码为特定数字(即 A = 1,B = 2),然后使用 SUM OVER PARTITION BY
,但这也行不通,因为我可以使用同样的产品,我不能只说计数 > 5,因为它可以与产品 A 进行 5 次曝光。
感谢任何帮助!
【问题讨论】:
【参考方案1】:将case
与窗口函数一起使用:
select t.*,
(case when num_b > 0 and num_c > 0 then 'All required'
when num_b > 0 then 'C missing'
when num_c > 0 then 'B missing'
else 'Both missing'
end) as requiredcheck
from (select t.*,
sum(case when product = 'B' then 1 else 0 end) over (partition by claim) as num_b,
sum(case when product = 'C' then 1 else 0 end) over (partition by claim) as num_c
from t
) t;
【讨论】:
你是我的英雄!非常感谢,这成功了!以上是关于分区时的情况 - 组的同一列中具有两个特定值的组的返回值的主要内容,如果未能解决你的问题,请参考以下文章