使用嵌套滞后或任何其他窗口函数

问题描述 投票:0回答:1

我正在处理一个包含一个日期列和一个标识符列的交易数据集。现在,我想追溯地创建一个布尔列,以检查如果上次发送活动是在 30 天之前,是否应该针对该标识符发送任何特定活动(例如营销活动)。我可以使用滞后函数,但问题是起点会不断变化。

例如,在第一个交易日,将发送活动,然后对于接下来 30 天内的任何交易,都不会发送活动;那么,假设下一笔交易发生在第一笔交易后的第 35 天;然后,发送一个活动,现在接下来 30 天的新计数器应该从第 35 天开始。

我一直不知道如何实现它。我正在使用redshift sql(下面的参考表)

感谢您的帮助! enter image description here

sql postgresql date amazon-redshift window-functions
1个回答
0
投票

您正在寻找迭代。第一个日期是 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;
© www.soinside.com 2019 - 2024. All rights reserved.