#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 немного меняется, поэтому я его опустил, но вы всегда можете добавить его снова