Объяснение
JOIN может умножить строки при связи many-to-many. NULL означает неизвестность, а не ноль. Оконные функции считают показатели, сохраняя отдельные строки, в отличие от GROUP BY.
Задача для самостоятельного решения
Почему COUNT(column) меньше COUNT(*)?
Показать разбор ответа
COUNT(column) пропускает NULL, COUNT(*) считает строки. Это различие полезно для оценки заполненности, но опасно при неверном знаменателе.