基于数据分区的案例陈述

时间:2017-12-12 22:15:58

标签: case amazon-redshift window-functions

我正在尝试根据变量中文本的存在对我拥有的每个id进行数据分类。例如:

ID Groupname
1   A
1   B
1   F
2   D
2   B
2   C

我想要的结果是

ID Groupname  Category
1   A           AF
1   B           AF
1   F           AF
2   D           D
2   B           D
2   C           D

我想做类似以下的事情,但我无法让它发挥作用

Select * ,
CASE WHEN A,F in groupname (partition by id) THEN AF
     WHEN D in groupname (partition by id) THEN D
      ....
     ELSE null END
FROM table

postgres / redshift中的答案将非常感谢!

编辑:

我解决了JNevill带来的F问题。

EDIT2:

如果您只需要1个组合,一位用户建议使用简单的解决方案。例如。如果我看到F或A那么它就是AF。但如果我需要看A和F它将无法工作。

这是一个简单的解决方案:

何时总和(在(20,28,19,27)然后1结束时的组合情况)超过(按log_id分区)= 1然后是1000

如果我想要组合,我必须执行以下操作,这将创建非常长的代码。有更简单的方法吗?

何时总和(在(20,28,19,27)然后1结束的情况下结束)(由log_id分区)= 1     和(总和(1048,598,428)中的groupid然后1结束时)(由log_id分区)= 1     那么1000

1 个答案:

答案 0 :(得分:0)

你对分区的情况是正确的,它只需要条件聚合

select
 *
,case
    when sum(case when groupname in ('A','F') then 1 end) over (partition by id)=1 then 'AF'
    when sum(case when groupname in ('D') then 1 end) over (partition by id)=1 then 'D'
end as category
from t

一个注意事项是,如果你只想要一对A和F来制作AF类别,则使用这种语法是不可能的...... count(distinct case...) over ()会返回一个错误并需要更复杂的查询,但是从我看到你的内容不需要它,因为F不在您的样本数据中