【发布时间】:2019-01-22 00:35:14
【问题描述】:
我在 Redshift 中有这张表,我正在尝试为以下数据集编写查询。对于诸如第 3 行之类的“续订成功”且前面有“子成功”的项目,我想将它们标记为“is_first_renewal = true”,但它们之前可能有任何数量的“续订失败”在他们成功之前,所以我不能在这种情况下使用窗口函数 LAG。
我也无法过滤掉 FAILURES,因为我的查询需要这些。
id phone op ts pr status result is_first_renewal
1 3345 xxxx 01/01/2018 6:59 0 SUB SUCCESS
2 3345 xxxx 28/02/2018 6:59 RENEWAL FAILURE
3 3345 xxxx 01/03/2018 6:59 20 RENEWAL SUCCESS TRUE
4 3345 xxxx 02/04/2018 6:59 20 RENEWAL SUCCESS FALSE
我目前的查询是这样的:
CASE
WHEN (status = 'RENEWAL' AND result = 'SUCCESS')
AND ( (last_value(CASE
WHEN pr = 0.0 AND result= 'SUCCESS' THEN
TRUE
END))
OVER (PARTITION BY phone
ORDER BY ts ASC
ROWS unbounded preceding) = 'SUB' ) THEN
TRUE
ELSE
FALSE
END AS is_first_renewal
FROM notifications
WHERE ((charge_status = 'SUCCESS')
OR (status ='RENEWAL'
AND result = 'FAILED'))
ORDER BY
op,
phone,
ts;
因此,目标是找到一种方法让 LAG 函数忽略那些“失败”项目......直到它可以找到前面的“子成功”项目。有什么建议? 提前致谢。
【问题讨论】:
-
“项目”是电话号码吗?如果不是,那么哪些列决定了项目?
标签: sql postgresql amazon-redshift window-functions