【发布时间】:2021-03-23 01:35:47
【问题描述】:
我正在使用表 TRANSACTIONS 进行同期群分析。下面是表架构,
USER_ID NUMBER,
PAYMENT_DATE_UTC DATE,
IS_PAYMENT_ADDED BOOLEAN
下面是一个快速查询,可查看 USER_ID 12345(一个示例)如何根据提供的日期过滤器通过不同的同类群组,
WITH RESULT(
SELECT
USER_ID,
TO_DATE(PAYMENT_DATE_UTC) AS PAYMENT_DATE,
SUM(CASE WHEN IS_PAYMENT_ADDED=TRUE THEN 1 ELSE 0 END) AS PAYMENT_ADDED_COUNT
FROM TRANSACTIONS
GROUP BY 1,2
HAVING PAYMENT_ADDED_COUNT>=1
ORDER BY 2
)
SELECT
COUNT(DISTINCT r.USER_ID),
SUM(r.PAYMENT_ADDED_COUNT)
FROM RESULT r
WHERE r.USER_ID=12345
AND (r.PAYMENT_DATE>='2021-02-01' AND r.PAYMENT_DATE<'2021-02-15')
此查询的时间范围(两周)的结果将是
| 1 | 55 |
对于所提供的日期过滤器,此 USER_ID 将被归类为普通用户群组(支付超过 10 次的用户)
如果在一天的时间范围内运行相同的查询,比如'2021-02-07',结果将是
| 1 | 10 |
对于所提供的日期过滤器,此 USER_ID 将被归类为偶尔用户群组(已进行 1 到 10 次付款的用户)
我有以下查询,可根据添加的付款总和将 USER_ID 分入两个不同的同类群组中,
WITH
ALL_USER_COHORT AS
(SELECT
USER_ID,
SUM(CASE WHEN IS_PAYMENT_ADDED=TRUE THEN 1 ELSE 0 END ) AS PAYMENT_ADDED_COUNT
FROM TRANSACTIONS
GROUP BY USER_ID
),
OCASSIONAL_USER_COHORT AS
(SELECT
USER_ID,
SUM(CASE WHEN IS_PAYMENT_ADDED=TRUE THEN 1 ELSE 0 END ) AS PAYMENT_ADDED_COUNT
FROM TRANSACTIONS
GROUP BY USER_ID
HAVING (PAYMENT_ADDED_COUNT>=1 AND PAYMENT_ADDED_COUNT<=10)
),
REGULAR_USER_COHORT AS
(SELECT
USER_ID,
SUM(CASE WHEN IS_PAYMENT_ADDED=TRUE THEN 1 ELSE 0 END ) AS PAYMENT_ADDED_COUNT
FROM TRANSACTIONS
GROUP BY USER_ID
HAVING PAYMENT_ADDED_COUNT>10
)
SELECT
COUNT(DISTINCT ou.USER_ID) AS "OCCASIONAL USERS",
COUNT(DISTINCT ru.USER_ID) AS "REGULAR USERS"
FROM ALL_USER_COHORT au
LEFT JOIN OCASSIONAL_USER_COHORT ou ON au.USER_ID=ou.USER_ID
LEFT JOIN REGULAR_USER_COHORT ru ON au.USER_ID=ru.USER_ID
LEFT JOIN TRANSACTIONS t ON au.USER_ID=t.USER_ID
WHERE au.USER_ID=12345
AND TO_DATE(t.PAYMENT_DATE_UTC)>='2021-02-07'
理想情况下,USER_ID 12345 应根据提供的日期过滤器存储为“OCCASIONAL USERS”,但查询将其存储为“REGULAR USERS”。
【问题讨论】:
-
您的偶然用户队列和常规用户队列 CTE 中没有日期过滤器。您拥有的 where 语句过滤器按照 sql 执行的顺序发生在连接操作之后。为什么不使用日期过滤器对一个 CTE 中的每个 user_id 求和,然后用另一个定义您的存储桶的 case 语句包装该 CTE?
-
向 CTE 添加日期过滤器会使每行的 PAYMENT_ADDED_COUNT 为 1...因为 USER_ID 只为给定日期付款...所以当我过滤一段时间一天之内,USER_ID 一直被归为 OCCASIONAL USERS
-
我不明白你用 CASE 语句包装 CTE 是什么意思
标签: sql group-by aggregate-functions snowflake-cloud-data-platform common-table-expression