使用SQL使用Snowflake对列的多行进行分类



我想在《雪花》中解决一个棘手的难题。

假设我有这样的数据

ID    tag
001     A
001     A
002     B
003     A
004     1
003     1
005     B
005     2
004     B
002     C
006     A
006     2
006     A

基本上,我的目标是根据以下标准将每个ID分类到一个唯一的表中。所以在所有给定ID中。

  • 如果在任何给定的点ID等于1 AND/OR A,则"GROUPA">
  • 如果在任何给定的点ID等于2 AND/OR B,则"GROUPB">
  • 如果1和B出现相同的ID或如果2和A出现相同的ID,则NULL

如果出现任何其他值,没有问题,我只关心1,2,A,B;每个ID将有一行至少包含其中一个。

所以结果DF将是…

ID      GROUP
001     GROUPA
002     GROUPB
003     GROUPA
004     NULL
005     GROUPB
006     NULL

注意,004006被消去,因为在0041B都出现了。同样,即使A006中出现了两次,2也不匹配,因此为NULL。

使用条件聚合,这里:COUNT_IF:

SELECT 
ID,
CASE WHEN COUNT_IF(tag IN ('1','A')) > 0 AND COUNT_IF(tag IN ('2','B')) > 0 THEN NULL
WHEN COUNT_IF(tag IN ('1','A')) > 0 THEN 'GROUPA'
WHEN COUNT_IF(tag IN ('2','B')) > 0 THEN 'GROUPB'
END AS grp
FROM tab
WHERE tag IN ('1', '2', 'A', 'B')
GROUP BY ID
ORDER BY ID;

最新更新