想要找到一个事件在一个月后接着多个事件中产生的金额

问题描述

我想查找特定事件产生的收入。 如果我要说的话,事件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()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...