我正在处理一个包含一个日期列和一个标识符列的交易数据集。现在,我想追溯地创建一个布尔列,以检查如果上次发送活动是在 30 天之前,是否应该针对该标识符发送任何特定活动(例如营销活动)。我可以使用滞后函数,但问题是起点会不断变化。
例如,在第一个交易日,将发送活动,然后对于接下来 30 天内的任何交易,都不会发送活动;那么,假设下一笔交易发生在第一笔交易后的第 35 天;然后,发送一个活动,现在接下来 30 天的新计数器应该从第 35 天开始。
我一直不知道如何实现它。我正在使用redshift sql(下面的参考表)
您正在寻找迭代。第一个日期是 2024 年 2 月 28 日。您正在使用此日期查找 30 天范围之后的第一个日期。该日期是 2024 年 3 月 30 日。然后您又想查找 30 天范围后的第一个日期,依此类推。
迭代是通过 SQL 中的递归查询完成的。您尚未使用 DBMS 标记您的请求,因此您必须调整以下查询以匹配 DBMS 所需的语法。
with recursive
starters (identifier, ts) as
(
select identifier, min(ts)
from mytable
group by identifier
union all
select t.identifier, min(t.ts)
from starters s
join mytable t on t.identifier = s.identifier
and t.ts > s.ts + interval '30' day
)
select
t.*,
exists
(
select null
from starters s
where s.identifier = t.identifier
and s.ts = t.ts
) as flag
from mytable t
order by t.identifier, ts;