繁体   English   中英

显示用户的连续天数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM