#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