Что такое агрегатные функции в SQL?
Что проверяют
Знаете ли вы поведение с пустыми значениями и различаете ли фильтрацию до и после группировки.
Как отвечать
Агрегатные функции сворачивают набор строк в одно значение: подсчёт, сумма, среднее, минимум, максимум, а также сбор значений в массив или строку.
Без группировки они схлопывают всю выборку в одну строку. С группировкой считаются отдельно для каждой группы.
select city, count(*), avg(salary)
from employees
where is_active
group by city
having count(*) > 5
order by avg(salary) desc;Два момента, на которых чаще всего спотыкаются.
Первый: пустые значения игнорируются. Все агрегатные функции пропускают их, и это меняет результат. Среднее считается только по заполненным строкам, а не по всем. Отдельно стоит подсчёт: со звёздочкой он считает все строки, а с именем колонки только строки с заполненным значением. Расхождение отчётов почти всегда растёт отсюда.
Второй: где фильтровать. Условие до группировки отсеивает строки, условие после группировки отсеивает группы и может использовать агрегаты. Написать условие по количеству в обычной фильтрации нельзя, потому что она выполняется раньше, чем группы вообще образуются.
Из порядка выполнения следует ещё одно правило: в выборке можно указывать только колонки из группировки и агрегаты. Обычная колонка вне группировки даст ошибку, потому что непонятно, какое из значений группы брать.
Полезное дополнение: если нужна агрегация без схлопывания строк, существуют оконные функции. Они считают то же самое, но оставляют каждую строку на месте, что позволяет показать рядом значение и долю от общего.
Где спотыкаются
Считают колонку вместо всех строк и получают заниженное число.
Пытаются фильтровать по агрегату до группировки.
Забывают, что пустые значения не участвуют в среднем.
Не знают про оконные функции и городят подзапросы.