我有下表:
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。
如果您不介意而不是随机选择一个返回最小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
请考虑以下查询:
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
(。
DB小提琴上的演示:
首次执行:
article_id | 区域设置 | category_name | is_primary_local ---------: |:----- |:------------ |:--------------- 1 |zh |答案 |t 2 |zh |问题 |f
第二次执行:
article_id | 区域设置 | category_name | is_primary_local | rn ---------: |:----- |:------------ |:--------------- |-: 1 |zh |答案 |t | 1 2 |德 |弗拉根 |F | 1