我正在尝试根据变量中文本的存在对我拥有的每个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
答案 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不在您的样本数据中