如何识别在 7 天内下了 3 个及以上订单的客户。 SQL/holistic/redshift

How to identify customer who make order for 3 and more orders in 7 days. SQL/holistic/redshift

总结:我想获取7天内拥有3个及更多 orderid的客户列表。如果客户满足每个日期的条件,则该客户可能会出现多次。

Table 姓名:T1

客户编号 订单号 创建于
A1B3 vds34rve4-3f 2021 年 1 月 1 日
AA2B hvdhkc767-s3d 2021 年 1 月 1 日
EA986 bckd33rfvfbvdf 2021 年 1 月 1 日
A1B3 jdbjkvshb3rdec 2021 年 1 月 1 日
SFK3 bhabsd-bbc83ccs 2021 年 2 月 1 日
AA2B hcbadcbsbc7cd 2021 年 3 月 1 日
A1B3 hjjac73an83-3fc 2021 年 7 月 1 日
DEH32 gdyafjk-24vfd 2021 年 7 月 1 日
A1B3 jkhbdj434jcbjke 2021 年 7 月 1 日
AA2B jkkcbjq90ksnc 2021 年 8 月 1 日
AA2B cjbugd3ahsddka 2021 年 8 月 1 日
A1B3 kbcq7w69ufj4t4 2021 年 9 月 1 日
SFK3 bcdubi7wklcna8 2021 年 9 月 1 日
EA986 cbyatea4jwndns 2021 年 9 月 1 日
A1B3 biqbdepaljkcl9 2021 年 9 月 1 日
AA2B nuqya8wownd2ln2 2021 年 9 月 1 日
A1B3 ndkuq2uowmdlqn 2021 年 9 月 1 日

预期输出:

客户编号 开始日期 结束日期 count_orderid
A1B3 2021 年 1 月 1 日 2021 年 7 月 1 日 4
Aa2B 2021 年 3 月 1 日 2021 年 9 月 1 日 4
A1B3 2021 年 7 月 1 日 2021 年 9 月 1 日 5

我目前的解决方案是

WITH daily_count_order AS (
   SELECT customerid, 
    DATE_TRUNC('day', createdat) AS startdate, 
    DATE_TRUNC('day', DATEADD(DAY, 6, createdat)) AS enddate,
    COUNT(orderid) AS count_order, 
    ROW_NUMBER() OVER (PARTITION BY customerid ORDER BY linkdate ASC) AS rows
  FROM T1
  GROUP BY userid, startdate, enddate
)

我不知道将有关条件的逻辑(7 天内 3 个和更多 orderid 转换为 sql 查询。

您可以为此使用 lead()。 . .但要数清楚就更难了。从满足此条件的日期开始:

select t.*
from (select t.*,
             lead(createdat, 2) over (partition by customerid order by createdat) as date_2
      from t
     ) t
where date_2 < createdat + interval '7 day';

如果您确实需要计数,那么一种方法是自连接:

select t.customerid, t.createdat, count(*)
from t join
     t t2
     on t2.customerid = t.customerid and
        t2.createdat >= t.createdat and
        t2.createdat < t.createdat + interval '7 day'
group by t.customerid, t.createdat
having count(*) >= 3;