如果存在其他明智的选择随机如何选择符合条件的行?

时间:2020-01-15 15:58:40

标签: sql window-functions presto

我有下表:

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。

2 个答案:

答案 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_idcategory_name)。

Demo on DB Fiddle

首次执行:

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