问题描述
我想查找特定事件产生的收入。 如果我要说的话,事件1于8/1/2020向客户A和B推荐,事件2于8/15/2020向客户B&C推荐,事件3于8/30/2020推荐。然后,要查找事件1产生的收入,我们需要找到该月是否再次投放的A客户和B客户。如果是,则考虑交易日期刚好在再次吸引客户之前。在给定的示例中,A客户再次推销2020年8月30日,B客户推销8/15/2020年,然后为事件1计算,我们需要考虑客户A从8/1到8/29/2020的交易/ 2020,而客户B从2020年8月1日到2020年8月14日。
事件表:
EventID CID Date
123 1 01-12-2020
123 2 01-12-2020
123 3 01-12-2020
345 2 05-12-2020
345 4 05-12-2020
456 1 07-12-2020
456 4 07-12-2020
567 1 08-12-2020
交易表:
UID Tran_Date Amount
1 03-12-2020 10
1 04-12-2020 20
1 07-12-2020 30
1 09-12-2020 40
2 03-12-2020 10
2 07-12-2020 30
2 07-12-2020 40
2 09-12-2020 30
3 07-12-2020 30
3 07-12-2020 40
3 09-12-2020 30
输出表:
EventID CID Sum
123 1 30
456 1 30
567 1 40
123 2 10
456 2 100
123 3 100
解决方法
一个选项使用窗口函数lead()
来获取“ next”事件的日期,然后通过联接引入事务,最后进行汇总:
select
e.eventid,e.cid,coalesce(sum(t.amount),0) total_amount
from (
select e.*,lead(date) over(partition by cid order by date) lead_date
from events e
) e
left join transactions t
on t.uid = e.cid
and t.tran_date >= e.date
and (t.tran_date < e.lead_date or e.lead_date is null)
group by e.eventid,e.cid
请注意,窗口功能仅在MySQL 8.0中可用。在早期版本中,您可以使用相关子查询来模拟lead()
。