[英]Shows consecutive days for user
我有这些数据,我正在尝试添加一列(day_in_row)
user_id date Action total_actions
1123 21/06/2018 Pageview 1
3321 20/06/2018 Pageview 6
3321 20/06/2018 Click 2
2122 19/05/2018 Pageview 1
2212 21/06/2018 Pageview 1
2212 20/06/2018 Pageview 1
2212 24/06/2018 Pageview 4
2212 24/06/2018 click 2
3321 21/06/2018 pageview 4
3321 21/06/2018 click 3
3321 17/06/2018 pageview 1
我正在尝试添加一列(day_in_row)
user_id date Action day_in_row total_actions
1123 21/06/2018 Pageview 1 1
3321 20/06/2018 Pageview 1 6
3321 20/06/2018 Click 1 2
2122 19/05/2018 Pageview 1 1
2212 21/06/2018 Pageview 2 1
2212 20/06/2018 Pageview 1 1
2212 24/06/2018 Pageview 1 4
2212 24/06/2018 click 1 2
3321 21/06/2018 pageview 2 4
3321 21/06/2018 click 2 3
3321 17/06/2018 pageview 1 1
我尝试使用此代码,但仍然不好
with Help([user_id],[date],action,total_actions,day_in_row,[default],[rank])
AS
(
Select * ,
1 as 'default',
case when datediff(day,isnull(lag(date,1) over (partition by user_id order by user_id, date),date) ,[date]) =1 then 1
else 0 end as 'rank'
From [dbo].[FactDailyUsers]
)
Select *, [default]+[rank]
From Help
谢谢!
如果我理解正确,这是一种差距和孤岛问题。 您想从日期中减去一个连续值以识别相邻日期。 对于具有连续日期的行,差异是恒定的。
在这种情况下,您有重复的日期,因此您想使用dense_rank()
而不是row_number()
。
那么你想要的值是dense-rank()
的另一个应用。
根据您的代码语法,我将使用 SQL 服务器语法和功能:
select fdu.*,
dense_rank() over (partition by user_id, dateadd(day, -seqnum, date)
order by date
) as day_in_row
from (select fdu.*,
dense_rank() over (partition by user_id order by date) as seqnum
from FactDailyUsers fdu
) fdu;
这是一个 db<>fiddle。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.