Как отфильтровать функцию окна с помощью sum в MYSQL?

#mysql #group-by #analytics

Вопрос:

Как мне написать этот запрос, чтобы фильтровать только суммы, превышающие 50? Я не могу заставить это работать с наличием или суммой, но я уверен, что есть какой-то способ.

 select name, sum(score) 
    from submissions inner join hacker on submissions.hacker_id = hacker.hacker_id
    group by submissions.hacker_id
    order by sum(score) desc
    having sum(score) > 50 
 

Возня с таблицами здесь (в них нет ничего необычного, этот запрос выполняется без последней строки, но возвращает оценки и имена всех участников): http://sqlfiddle.com/#!9/7a660d/16

Комментарии:

1. Как правило, мы ГРУППИРУЕМ ПО любым и всем неагрегированным столбцам, определенным в ВЫБОРКЕ, а не просто полагаемся на (предполагаемую) функциональную зависимость (которая на самом деле может не существовать)

2. В упражнении меня просят возвращать только имена людей с баллами выше 50 и их баллы, но я должен присоединиться к hacker_id, который является общим столбцом между таблицами имен и представлений. Не совсем уверен, что здесь означает функциональная зависимость.

Ответ №1:

Ваш заказ должен быть сделан после того, как у вас будет. т. е.

 
select 
    name, 
    sum(score) 
from 
    submissions 
inner join 
    hacker on submissions.hacker_id = hacker.hacker_id
group by 
    submissions.hacker_id
having 
    sum(score) > 50 
order by 
    sum(score) desc
 

Ответ №2:

Заказ по должен быть в последнем

 select name, sum(score) 
from submissions 
inner join hacker on submissions.hacker_id = hacker.hacker_id
group by submissions.hacker_id
having sum(score) > 50 
order by sum(score) desc
 

Ответ №3:

Вы также можете использовать РЕГИСТР в выражении суммы. Этот подход работает в функции Windows, хотя я не тестировал его для опции 1 агрегатной функции обычной суммы (случай в агрегатной сумме).:

 select name, sum(case when score>50 else 0 end) 
from submissions inner join hacker on submissions.hacker_id = hacker.hacker_id
group by submissions.hacker_id
order by sum(score) desc
 

Вариант 2 Функция Windows:

 select name, 
sum(case when score>50 else 0 end) over (partition by submissions.hacker_id)
from submissions inner join hacker on submissions.hacker_id = hacker.hacker_id
group by submissions.hacker_id
 

Предложение order by немного меняется, поэтому я его опустил, но вы всегда можете добавить его снова