要解决这类问题,首要搞清楚
A.如何证明时间是连续的
B.如何把连续的时间抽出来
C.如何限制连续的时间是多久
以SQL29 某宝店铺连续2天及以上购物的用户及其对应的天数为例
·
A.如何证明时间是连续的
这个首先需要①排序
with a as(
select
user_id,
sales_date,
ROW_number() over(PARTITION by user_id ORDER BY sales_date)'rn'#①排序
FROM
sales_tb)
其次,进行②作差
date_add(sales_date,INTERVAL,-rn day)
作差的原理如下:
当时间连续的时候,那么时间减去排序就会得到一个相同的值,同样,作差值相同就说明那段时间连续
·
B.如何把连续的时间抽出来
group by date_add(sales_date,INTERVAL,-rn day)
group by 作差的结果就是把作差相同的值抽出来进行分组,即把连续的时间抽出分组在一起
·
C.如何限制连续的时间是多久
`
这里是连续2天及以上
having count(*)>=2
`
完整代码如下
with a as(
select
user_id,
sales_date,
row_number() over(partition by user_id order by sales_date) 'rn'#A①排序
from
sales_tb)
select
user_id,
count(*)days_count
from a
group by #B.如何把连续的时间抽出来
user_id,
date_add(sales_date,INTERVAL -rn day) #A②作差
having count(*)>=2 #C.如何限制连续的时间是多久