Какие агрегатные функции существуют
Что проверяют
Базовый SQL с прицелом на аналитику: знаете ли вы, как агрегаты обращаются с NULL, чем WHERE отличается от HAVING и где агрегат переходит в оконную функцию. Следом часто дают задачу: посчитать метрику по группам или медиану.
Как отвечать
Агрегатная функция сворачивает набор строк в одно значение: по одному на каждую группу GROUP BY или одно на всю выборку. Основной набор:
COUNT:COUNT(*)считает строки,COUNT(col)только непустые значения,COUNT(DISTINCT col)уникальные;SUMиAVG: пропускаютNULL. Значит,AVG(col)делит на число непустых значений, а не строк. Если пропуск должен считаться нулём, пишитеAVG(COALESCE(col, 0))осознанно;MINиMAX: работают с числами, датами и строками;- статистические:
STDDEV,VARIANCE, в PostgreSQL медиана черезpercentile_cont(0.5) WITHIN GROUP (ORDER BY x); - сборка значений:
string_agg,array_agg, в PostgreSQL ещёbool_andиbool_or; - условная агрегация:
COUNT(*) FILTER (WHERE status = 'paid')или переносимыйSUM(CASE WHEN ... THEN 1 ELSE 0 END).
Проговорите, что GROUP BY и HAVING не функции, а части запроса: WHERE фильтрует строки до группировки, HAVING фильтрует группы после. И что почти любой агрегат становится оконным через OVER (PARTITION BY ...): строки не схлопываются, каждая получает значение своей группы. Для аналитика это ежедневный инструмент, так считают долю от итога и накопительную сумму.
Добавьте мостик к pandas: df.groupby('city').agg(...), при этом count() в pandas тоже не учитывает NaN, а size() считает все строки.
Где спотыкаются
Считают COUNT(col) и COUNT(*) одним и тем же и получают разные цифры конверсии на колонке с пропусками.
Фильтруют по агрегату в WHERE. Это ошибка, условие на агрегат пишется в HAVING или во внешнем запросе.
Выводят в SELECT колонку, которой нет в GROUP BY и которая не под агрегатом. PostgreSQL в общем случае вернёт ошибку, а MySQL с выключенным ONLY_FULL_GROUP_BY молча подставит произвольное значение из группы.