【问题标题】:How to choose row that met criteria if exist other wise randomly choose another?如果存在,如何选择符合条件的行,否则随机选择另一个?
【发布时间】:2020-05-02 10:34:12
【问题描述】:

我有下表:

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。

【问题讨论】:

    标签: sql window-functions presto


    【解决方案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)。

    Demo on DB Fiddle:

    第一次执行:

    article_id |语言环境 |类别名称 | is_primary_local ---------: | :----- | :------------ | :--------------- 1 | zh |答案 |吨 2 | zh |问题 | F

    第二次执行:

    article_id |语言环境 |类别名称 | is_primary_local | rn ---------: | :----- | :------------ | :--------------- | -: 1 | zh |答案 |吨 | 1 2 |德 |神经质 | f | 1

    【讨论】:

      【解决方案2】:

      如果您不介意随机选择一个来返回最小值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
      

      【讨论】:

        猜你喜欢
        • 2014-02-21
        • 2020-01-01
        • 2018-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多