【发布时间】:2022-01-22 06:54:13
【问题描述】:
我有一个具有以下架构的表:
CREATE TABLE example (
userID,
status, --'SUCCESS' or 'FAIL'
date -- self explanatory
);
INSERT INTO example
Values(123, 'SUCCESS', 20211010),
(123, 'SUCCESS', 20211011),
(123, 'SUCCESS', 20211028),
(123, 'FAIL', 20211029),
(123, 'SUCCESS', 20211105),
(123, 'SUCCESS', 20211110)
我正在尝试利用滞后或领先功能来评估当前行是否在前一个“成功”的 2 周窗口内。鉴于当前数据,我预计 isWithin2WeeksofSuccessFlag 如下:
123, 'SUCCESS', 20211010,0 --since it is the first instance
123, 'SUCCESS', 20211011,1
123, 'SUCCESS', 20211028,1
123, 'FAIL', 20211029, 1 --failed, but criteria is that it is within 2 weeks of last success, which it is
123, 'SUCCESS', 20211105, 1 --last success is 2 rows back, but it is within 2 weeks
123, 'SUCCESS', 20211128, 0 --outside of 2 weeks
我最初会考虑做这样的事情:
Select userID, status, date,
case when lag(status,1) over (partition by userid order by date asc) = 'SUCCESS'
and date_add('day',-14, date) <= lag(date,1) over (partition by userid order by date asc)
then 1 end as isWithin2WeeksofSuccessFlag
from example
如果我没有 'FAIL' 行,这会起作用。为了处理它,我可以将滞后修改为 2(而不是 1),但是如果我连续有 2、3、4、n 'FAIL' 呢?我需要落后 3,4,5,n+1。两者之间的具体失败次数是可变的。如何处理这种可变性?
注意 我正在查询数十亿行。效率并不是真正的问题(因为它是用于分析),但遇到内存分配错误是。因此,无休止地添加更多窗口函数可能会导致查询自动终止,因为内存需求是超过节点限制。
我应该如何处理?
【问题讨论】:
-
Edit 问题并标记您正在使用的 DBMS。
-
这需要按用户执行还是按日期顺序执行而不考虑用户?目前尚不清楚您希望如何处理用户。
-
@JonArmstrong 它必须由用户分区。在我的示例中,我只有一个用户,但该表有很多。并且表格应该按用户排序,日期升序。
标签: sql memory window-functions trino