问题描述
我正在尝试创建一个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))