Обзор
В этом отчете мы рассмотрим SQL-запрос, использующий функцию FILTER для сегментации данных пользователей на основе их предпочтений в отношении сводок активности. Функция FILTER — это мощный инструмент в SQL, позволяющий выполнять условную агрегацию в рамках одного запроса, что дает возможность применять агрегатные функции, такие как COUNT(), SUM(), AVG() и другие, к подмножеству данных.
Разбор SQL-запроса
Представленный SQL-запрос подсчитывает количество пользователей с различными настройками сводок активности. Ниже приведено подробное описание каждой части запроса:
SELECT
COUNT(*) FILTER (WHERE uo.email_digests = false) AS "Отключено",
COUNT(*) FILTER (WHERE uo.email_digests = true) AS "Всего включено",
COUNT(*) FILTER (WHERE uo.email_digests = true AND u.last_seen_at > CURRENT_DATE - INTERVAL '180 DAYS') AS "Пропущено",
COUNT(*) FILTER (WHERE uo.email_digests = true AND uo.digest_after_minutes = 30) AS "Каждые полчаса",
COUNT(*) FILTER (WHERE uo.email_digests = true AND uo.digest_after_minutes = 60 ) AS "Ежечасно",
COUNT(*) FILTER (WHERE uo.email_digests = true AND uo.digest_after_minutes = 1440) AS "Ежедневно",
COUNT(*) FILTER (WHERE uo.email_digests = true AND uo.digest_after_minutes = 10080) AS "Еженедельно",
COUNT(*) FILTER (WHERE uo.email_digests = true AND uo.digest_after_minutes = 43200) AS "Ежемесячно",
COUNT(*) FILTER (WHERE uo.email_digests = true AND uo.digest_after_minutes = 259200) AS "Каждые 6 месяцев"
FROM user_options uo
JOIN users u ON u.id = uo.user_id
WHERE uo.user_id > 0
COUNT(*) FILTER (WHERE условие)подсчитывает количество строк, удовлетворяющих указанному условию.- Ключевое слово
ASпереименовывает выходные столбцы для улучшения читаемости. - Запрос соединяет таблицу
user_optionsс таблицейusers, чтобы получить доступ к настройкам пользователей и данным об их активности. - Условие
WHERE uo.user_id > 0исключает системных пользователей или нестандартные записи.
Как работает функция FILTER
Функция FILTER используется вместе с агрегатной функцией для подсчета только тех строк, которые соответствуют определенным критериям. Это более читаемая и часто более эффективная альтернатива использованию подзапросов или операторов CASE для условной агрегации.
Общий синтаксис использования FILTER выглядит следующим образом:
АГРЕГАТНАЯ_ФУНКЦИЯ(имя_столбца) FILTER (WHERE условие) AS псевдоним
Когда использовать функцию FILTER
Функция FILTER особенно полезна, когда необходимо выполнить несколько подсчетов (или других агрегаций) с различными условиями в рамках одного запроса. Она упрощает запрос и избавляет от необходимости использовать множественные подзапросы или сложные операторы CASE.
Вы можете использовать функцию FILTER для сегментации пользователей по их предпочтениям, постов по реакциям или тем по категориям, среди других вариантов использования. Это универсальный инструмент, способный улучшить отчетность и анализ данных.
Заключение
Функция FILTER — ценное дополнение к любому набору инструментов SQL. Она позволяет выполнять четкую и лаконичную условную агрегацию, делая сложные запросы к данным более управляемыми и понятными.