我有下表:
article_id , locale, category_name, is_primary_local
1 en answers True
1 es respuestas False
2 en questions False
2 de fragen False
2 it domande False
密钥是(article_id, locale)
我想创建一个以article_id
作为键的表。
逻辑是如果存在主要本地,则将其用于category_name
。如果没有,则随机选择一个。每个article_id
只能有一个primary_local。
所以输出看起来像:
article_id , category_name
1 answers
2 fragen -- or domande, questions
这是我尝试过的:
SELECT
article_id,
MIN(CASE WHEN is_primary_local Then category_name else ????? END) as category_name
From table
GROUP BY article_id
但是我不知道如何解决这种情况?
我正在使用presto sql。
答案 0 :(得分:1)
考虑以下查询:
select article_id, locale, category_name, is_primary_local
from (
select
t.*,
row_number()
over(partition by article_id order by is_primary_local desc, random()) rn
from mytable t
) t
where rn = 1
内部查询对article_id
组中的记录进行排名,并按降序is_primary_local
(这将true
的值降序)进行排序,然后随机进行。外部查询在每个组的顶部记录上进行过滤。作为使用窗口函数的一项奖励,您可以返回所有列(不仅是article_id
和category_name
)。
首次执行:
article_id | locale | category_name | is_primary_local ---------: | :----- | :------------ | :--------------- 1 | en | answers | t 2 | en | questions | f
第二次执行:
article_id | locale | category_name | is_primary_local | rn ---------: | :----- | :------------ | :--------------- | -: 1 | en | answers | t | 1 2 | de | fragen | f | 1
答案 1 :(得分:1)
如果您不介意而不是随机选择 来返回最小值category_name
,则在代码中使用COALESCE()
就像这样:
SELECT
article_id,
COALESCE(
MIN(CASE WHEN is_primary_local THEN category_name END),
MIN(category_name)
) as category_name
From tablename
GROUP BY article_id