我的订阅表如下所示
+---------+-------------+------------+------------+
| 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
?
答案 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