Redshift RDS (PostgreSQL):仅过滤 4 列中的 1 列
Redshift RDS (PostgreSQL): Filter only 1 of 4 Columns
将我的查询写入 return 以下内容的最简单方法是什么:
- signup_month
- total_signups
- business_signups
- total_users
假设 注册 table 看起来像这样:
| date | signup_email | tier | users |
| ---------- | ------------ | ------------ | ----- |
| 2014-05-02 | personal | trial | 1 |
| 2014-05-04 | personal | subscription | 1 |
| 2014-05-12 | personal | subscription | 2 |
| 2014-05-25 | business | trial | 1 |
| 2014-06-02 | personal | subscription | 1 |
| 2014-06-20 | business | subscription | 10 |
| 2014-06-30 | business | trial | 5 |
这是一个仅输出 3 列(signup_month、total_signups 和 total_users)的基本查询。我在为 business_signups 添加第 4 列时遇到问题(不包括 signup_email = personal 和 tier = trial
SELECT
DATE_PART(month,signup_date) AS signup_month,
COUNT(signup_email) AS total_signups,
SUM(users) AS total_users
FROM signups
GROUP BY 1;
但是,我很难计算 'business_signups' 的数量,而不必编写 2 个查询。我正在寻找如下所示的输出:
| signup_month | total_signups | business_signups | total_users |
| ------------ | ------------- | ---------------- |------------ |
| 5 (May) | 4 | 1 | 5 |
| 6 (Jun) | 3 | 2 | 16 |
添加仅过滤 business_signups 的最后一列的最简单方法是什么?
尝试将条件表达式放入 SUM
:
SELECT
DATE_PART(month,signup_date) AS signup_month,
COUNT(signup_email) AS total_signups,
SUM(users) AS total_users,
SUM(DECODE(signup_email, 'business', 1, 0)) as business_signups
FROM signups
GROUP BY 1;
或
SELECT
DATE_PART(month,signup_date) AS signup_month,
COUNT(signup_email) AS total_signups,
SUM(users) AS total_users,
SUM(CASE WHEN signup_email = 'personal' AND tier = 'trial' THEN 0 ELSE 1 END)) as business_signups
FROM signups
GROUP BY 1;
我 强烈 建议将年份与月份保持一致,除非您特别想将不同年份的同一个月组合起来(您的问题并未表明您的意图)。
然后,您可以使用条件聚合:
SELECT DATE_TRUNC('month', signup_date) AS signup_month,
COUNT(*) as total_signups,
SUM(users) AS total_users,
SUM( (signup_email = 'business')::int ) as business_signups
FROM signups
GROUP BY signup_month;
这假设当注册电子邮件是“企业”时,企业注册是真实的。这与问题中的数据是一致的。
将我的查询写入 return 以下内容的最简单方法是什么:
- signup_month
- total_signups
- business_signups
- total_users
假设 注册 table 看起来像这样:
| date | signup_email | tier | users |
| ---------- | ------------ | ------------ | ----- |
| 2014-05-02 | personal | trial | 1 |
| 2014-05-04 | personal | subscription | 1 |
| 2014-05-12 | personal | subscription | 2 |
| 2014-05-25 | business | trial | 1 |
| 2014-06-02 | personal | subscription | 1 |
| 2014-06-20 | business | subscription | 10 |
| 2014-06-30 | business | trial | 5 |
这是一个仅输出 3 列(signup_month、total_signups 和 total_users)的基本查询。我在为 business_signups 添加第 4 列时遇到问题(不包括 signup_email = personal 和 tier = trial
SELECT
DATE_PART(month,signup_date) AS signup_month,
COUNT(signup_email) AS total_signups,
SUM(users) AS total_users
FROM signups
GROUP BY 1;
但是,我很难计算 'business_signups' 的数量,而不必编写 2 个查询。我正在寻找如下所示的输出:
| signup_month | total_signups | business_signups | total_users |
| ------------ | ------------- | ---------------- |------------ |
| 5 (May) | 4 | 1 | 5 |
| 6 (Jun) | 3 | 2 | 16 |
添加仅过滤 business_signups 的最后一列的最简单方法是什么?
尝试将条件表达式放入 SUM
:
SELECT
DATE_PART(month,signup_date) AS signup_month,
COUNT(signup_email) AS total_signups,
SUM(users) AS total_users,
SUM(DECODE(signup_email, 'business', 1, 0)) as business_signups
FROM signups
GROUP BY 1;
或
SELECT
DATE_PART(month,signup_date) AS signup_month,
COUNT(signup_email) AS total_signups,
SUM(users) AS total_users,
SUM(CASE WHEN signup_email = 'personal' AND tier = 'trial' THEN 0 ELSE 1 END)) as business_signups
FROM signups
GROUP BY 1;
我 强烈 建议将年份与月份保持一致,除非您特别想将不同年份的同一个月组合起来(您的问题并未表明您的意图)。
然后,您可以使用条件聚合:
SELECT DATE_TRUNC('month', signup_date) AS signup_month,
COUNT(*) as total_signups,
SUM(users) AS total_users,
SUM( (signup_email = 'business')::int ) as business_signups
FROM signups
GROUP BY signup_month;
这假设当注册电子邮件是“企业”时,企业注册是真实的。这与问题中的数据是一致的。