Оператор MySQL, который возвращает только строки по идентификатору, где имя появляется большую часть времени

#mysql #sql #count #subquery #having-clause

#mysql #sql #количество #подзапрос #having-предложение

Вопрос:

Таблица t1

 id | name
_________
1  | ann
1  | joe
1  | joe

2  | ann
2  | ann
2  | joe
2  | joe

3  | ted
3  | ann
3  | joe

4  | bob
4  | bob
4  | bob
4  | ted
 

Оператор MySQL, который возвращает только идентификаторы, в которых имя появляется большую часть времени,

 id
__
1
4
 

Я пробовал следующее, но оно не возвращает никаких результатов,

 SELECT `id` FROM `t1` GROUP BY `id` having max(name) > 0.5 * max(name)
 

Ответ №1:

Вы можете использовать оконные функции и агрегирование:

 select id, name
from (select id, name, count(*) as cnt,
             sum(count(*)) over (partition by id) as id_cnt
      from t
      group by id, name
     ) ni
where cnt > 0.5 * id_cnt;