如何根据事件而非日期计算SQL中的客户保留率?

问题描述

我正在尝试创建一个SQL语句,以找出哪个客户没有参加最近的三个活动。

表1-客户:

客户ID,客户名称

表2-事件

事件ID,事件日期,事件名称

表3-事件活动

事件ID,客户ID

现在,我正在寻找连续三场未参加活动的客户。

感谢您的帮助。

解决方法

一种方法是生成所有(最后三个)事件和客户的列表,然后为没有事件的客户进行过滤:

select c.customer_id
from customer c cross join
     (select e.*
      from events e
      order by event_date desc
      fetch first 3 rows only
     ) e left join
     event_activity ea
     on ea.customer_id = c.customer_id and ea.event_id = e.event_id
group by c.customer_id
having count(ea.event_id) < 3;

另一种方法是过滤出没有全部三个客户的客户:

select c.*
from customers c
where (select count(*)
        from event_activity ea join
             (select e.*
              from events e
              order by event_date desc
              fetch first 3 rows only
             ) e
             on e.event_id = ea.event_id
        where ea.customer_id = e.customer_id
       ) < 3;
,

如果您正在寻找未参加最近3个活动的客户(假设这就是“最后三个活动”的意思)

select customer_id,customer_name
   from customers 
   where customer_id in  
      (select customer_id
       from event_activity 
       where event_id in
          (select event_id 
          from events_table
          where rownum <= 3
          order by event_date desc))

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...