Redshift RDS (PostgreSQL):仅过滤 4 列中的 1 列

Redshift RDS (PostgreSQL): Filter only 1 of 4 Columns

将我的查询写入 return 以下内容的最简单方法是什么:

假设 注册 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;

这假设当注册电子邮件是“企业”时,企业注册是真实的。这与问题中的数据是一致的。