Как выбрать строку, которая соответствует критериям, если существуют другие, случайно выбрать другой? - PullRequest
1 голос
/ 15 января 2020

У меня есть следующая таблица:

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. Лог c - если есть первичный локальный, используйте это для 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

Но я не Не знаете, как закончить sh это условие случая?

Я использую presto sql.

Ответы [ 2 ]

1 голос
/ 15 января 2020

Если вы не возражаете, вместо выберите случайным образом , чтобы получить минимум 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
1 голос
/ 15 января 2020

Рассмотрим следующий запрос:

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 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
...