获取特定用户的下一个购买日期

时间:2019-11-24 13:52:06

标签: sql sql-server

我的订阅表如下所示

+---------+-------------+------------+------------+
| user_id | purchase_id | start_date |  end_date  |
+---------+-------------+------------+------------+
|       1 | 1A          | 2019-01-12 | 2019-01-22 |
|       1 | 1B          | 2019-01-24 | 2019-02-03 |
|       1 | 1C          | 2019-02-06 | 2019-02-16 |
|       1 | 1D          | 2019-03-12 | 2019-03-22 |
|       1 | 1E          | 2019-04-01 | 2019-04-11 |
|       2 | 2A          | 2019-02-12 | 2019-02-22 |
|       2 | 2B          | 2019-02-23 | 2019-03-05 |
|       2 | 2C          | 2019-03-06 | 2019-03-16 |
|       2 | 2D          | 2019-03-18 | 2019-03-28 |
|       3 | 3A          | 2019-02-12 | 2019-02-22 |
|       3 | 3B          | 2019-02-23 | 2019-03-05 |
|       3 | 3C          | 2019-03-06 | 2019-03-16 |
|       3 | 3D          | 2019-03-18 | 2019-03-28 |
|       4 | 4A          | 2019-04-10 | 2019-04-20 |
|       4 | 4B          | 2019-04-25 | 2019-05-05 |
|       4 | 4C          | 2019-05-13 | 2019-05-23 |
+---------+-------------+------------+------------+

它具有有关用户(user_id)何时购买特定订阅(start_date)的信息。每个购买都有一个与之关联的purchase_id

我想知道用户购买的下一个订阅的start_date是什么,仅针对某些purchase_id。这些purchase_id在下表中

+---------+-------------+------------+------------+
| user_id | purchase_id | start_date |  end_date  |
+---------+-------------+------------+------------+
|       1 | 1B          | 2019-01-24 | 2019-02-03 |
|       2 | 2C          | 2019-03-06 | 2019-03-16 |
|       3 | 3D          | 2019-03-18 | 2019-03-28 |
+---------+-------------+------------+------------+

所以对于user_id = 1,我想知道下一个start_date是什么。但是start_date应该是purchase_id = 1B之后进行的下一次购买(本例中为1C)

类似地,对于user_id = 2,我想知道下一个start_date是什么。但是start_date应该是purchase_id = 2C之后进行的下一次购买(在这种情况下为2D)

我想要的结果如下所示

+---------+-------------+------------+------------+--------------------+------------------+
| user_id | purchase_id | start_date |  end_date  | Next_Purchase_date | Next_purchase_id |
+---------+-------------+------------+------------+--------------------+------------------+
|       1 | 1B          | 2019-01-24 | 2019-02-03 | 2019-02-06         | 1C               |
|       2 | 2C          | 2019-03-06 | 2019-03-16 | 2019-03-18         | 2D               |
|       3 | 3D          | 2019-03-18 | 2019-03-28 | NULL               | NULL             |
+---------+-------------+------------+------------+--------------------+------------------+

我可以使用以下代码获得下一次购买日期

SELECT A.*, 
LEAD(start_date) OVER(PARTITION BY user_id ORDER BY start_date) as Next_Purchase_date,
LEAD(purchase_id) OVER(PARTITION BY user_id ORDER BY start_date) as Next_Purchase_id
FROM Table1 A

但是我怎么只能在某些next_purchase_date内获得purchase_id

SQL Fiddle

2 个答案:

答案 0 :(得分:1)

如果我的理解正确,您想过滤LEAD()。但是,如果添加WHERE子句,则会影响window函数。

因此,使用子查询并在计算<LEAD()之后过滤

SELECT A.*
FROM (SELECT A.*, 
             LEAD(start_date) OVER(PARTITION BY user_id ORDER BY start_date) as Next_Purchase_date,
             LEAD(purchase_id) OVER(PARTITION BY user_id ORDER BY start_date) as Next_Purchase_id
      FROM Table1 A
     ) a JOIN
     B b
     ON b.user_id = a.user_id AND
        b.purchase_id = a.purchase_id;

注意:在这种情况下,如果b left join a中的某些行可能在b中没有对应的行,则您实际上可能想要a

答案 1 :(得分:1)

假设您确实有第二张表,例如lead,该表存储了要查看其下一次购买的记录,则可以在子查询中计算 select t1.* from ( select t1.*, lead(start_date) over(partition by user_id order by start_date) next_purchase_date, lead(purchase_id) over(partition by user_id order by start_date) next_purchase_id from table1 t1 ) t1 inner join table2 t2 on t1.user_id = t2.user_id and t1.purchase_id = t2.purchase_id and t1.start_date = t2.start_date and t1.end_date = t2.end_date ,然后将其联接与第二张表:

format