分区时的情况 - 组的同一列中具有两个特定值的组的返回值

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;

【讨论】:

你是我的英雄!非常感谢,这成功了!

以上是关于分区时的情况 - 组的同一列中具有两个特定值的组的返回值的主要内容,如果未能解决你的问题,请参考以下文章

来自不同消费者组的多个消费者如何从同一个分区中读取?

删除同一列或连续行的另一列中具有特定值和缺失值的行

清除具有大量形状/多线程的组的最快方法

消除类似行但具有特定值

Drupal Group模块,以编程方式将用户添加到具有特定角色的组中

如何在sql中找到具有多个最大值的组的最大值?