postgresql — выберите 4 столбца, 1 из которых требует фильтрации

#sql #postgresql #amazon-redshift #amazon-rds

Вопрос:

Начинающий пользователь PostgreSQL здесь еще не очень хорошо разбирается в СОЕДИНЕНИИ или СЛУЧАЕ.

Каков наилучший способ фильтрации в моем операторе select, чтобы я мог получить следующий вывод:

  • месяц регистрации
  • всего подписей
  • бизнес-подписи
  • всего пользователей

пример таблицы:

Дата регистрация по электронной почте уровень Пользователи
2014-05-02 личный пробный 1
2014-05-04 личный подписка 1
2014-05-12 личный подписка 2
2014-05-25 бизнес пробный 1
2014-06-02 личный подписка 1
2014-06-20 бизнес подписка 10
2014-06-30 бизнес пробный 5

Пример вывода:

месяц регистрации всего подписей бизнес-подписи всего пользователей
мочь 4 1 5
Июнь 3 2 16

Вот базовый запрос, который выводит только 3 столбца (signup_month, total_signups и total_users). У меня возникли проблемы с добавлением 4-го столбца, который просто подсчитывает бизнес-подписи из столбца signup_email, поскольку для этого требуется подсчет только значений, которые = «бизнес»

 SELECT DATE_PART(month,signup_date) AS signup_month,
       COUNT(signup_email) AS total_signups,
       SUM(users) AS total_users

FROM signups
GROUP BY signup_month;
 

Ответ №1:

Вам нужна условная агрегация, которую в Postgres использует filter .

Тем не менее, вы, вероятно, захотите включить год вместе с месяцем, поэтому я рекомендую date_trunc() :

 SELECT DATE_TRUNC('month', signup_date) AS signup_month,
       COUNT(*) AS total_signups,
       COUNT(*) FILTER (WHERE signup_email = 'business') as business_signups,
       SUM(users) AS total_users
FROM signups
GROUP BY signup_month