首页 > 解决方案 > 如何过滤使用 MAX(CASE WHEN ... END) 生成的字段?

问题描述

我已经使用下面的查询从 1 月到 5 月的数据中成功检索了数据,为每个客户生成了第一次和第二次购买。

SELECT
    MAX(CASE WHEN row_num = 1 THEN month END) AS month,
    customer_id,
    1 AS row_num,
    DATE_DIFF(MAX(CASE WHEN row_num = 2 THEN verified_date END),
              MAX(CASE WHEN row_num = 1 THEN verified_date END), DAY) AS difference
FROM yourTable
GROUP BY
    customer_id;

现在,我想过滤月份以让所有用户在 1 月至 4 月进行第一次交易,并在任何时间(1 月至 5 月)进行第二次交易并尝试以下查询:

SELECT
    MAX(CASE WHEN row_num = 1 AND month IN (1,2,3,4) THEN month END) AS month,
    customer_id,
    1 AS row_num,
    DATE_DIFF(MAX(CASE WHEN row_num = 2 THEN verified_date END),
              MAX(CASE WHEN row_num = 1 THEN verified_date END), DAY) AS difference
FROM yourTable
GROUP BY
    customer_id;

查询成功运行,但是,它生成了月份 1 2 3 4,并且在月份字段中生成了 NULL。

为什么里面有NULL?

谢谢

标签: sqlgoogle-bigquery

解决方案


假设每个客户的订单交易按时间顺序排列,当行的月份与 1、2、3 或 4 不同时,即“第一笔交易在 5 月”时,row_num将最终为空。yourTableMAX(CASE WHEN row_num = 1 AND month IN (1,2,3,4) THEN month END) AS month,row_num = 1

要过滤,请使用HAVING MAX(CASE WHEN row_num = 1 AND month IN (1,2,3,4) THEN month END) is not null.


推荐阅读