Какое правильное решение для запроса SQL ниже? - PullRequest
3 голосов
/ 24 апреля 2020

Распечатать название всех мероприятий без максимального или минимального количества участников

Я пробовал следующий запрос, но выдает ошибку:

select ACTIVITY
from (select ACTIVITY, count(*) as cnt,
             max(count(*)) as max_cnt,
             min(count(*)) as min_cnt
      from FRIENDS GROUP BY ACTIVITY) FRIENDS
where cnt not in (max_cnt, min_cnt);

ОШИБКА: ОШИБКА 1111 (HY000) в строке 1: недопустимое использование групповой функции MYSQL ВЕРСИЯ: 8

Ответы [ 3 ]

1 голос
/ 24 апреля 2020

Предположительно, вы не используете MySQL 8.0 (в противном случае ответ на ваш предыдущий вопрос просто сработал бы).

В более ранних версиях вы можете выполнить:

select activity, count(*) no_activities
from friends
group by activity
having 
        count(*) > (select count(*) from friends group by activity order by count(*)  asc limit 1)
    and count(*) < (select count(*) from friends group by activity order by count(*) desc limit 1)
0 голосов
/ 24 апреля 2020

Попробуйте следующее, оно должно работать с использованием оконной функции в MySQL 8.0.

select
    activity
from
(
    select 
        activity, 
        count(*) over () as ttl,
        dense_rank() over (order by count(*)) as rnk
    from friends 
    group by 
        activity
)  val
where rnk != 1 and rnk != ttl - 1  
0 голосов
/ 24 апреля 2020

Требуются оконные функции:

select ACTIVITY
from (select ACTIVITY, count(*) as cnt,
             max(count(*)) over () as max_cnt,
             min(count(*)) over () as min_cnt
      from FRIENDS 
      group by activity
     ) a
where cnt not in (max_cnt, min_cnt);

Для вышеперечисленного требуется MySQL 8+. В более ранней версии это более болезненно:

select a.ACTIVITY
from (select ACTIVITY, count(*) as cnt,
             max(count(*)) over () as max_cnt,
             min(count(*)) over () as min_cnt
      from FRIENDS 
      group by activity
     ) a join
     (select min(cnt) as min_cnt, max(cnt) as max_cnt
      from (select activity, count(*) as cnt
            from friends
            group by activity
           ) a
     ) am
     on a.cnt not in (am.max_cnt, am.min_cnt);
...