繁体   English   中英

如果下一行状态相同,则分区给出相同等级

[英]Partitioning that gives the same rank if the next row status is the same

寻求帮助解决分区问题,如果下一行与前一行具有相同的状态,我试图给出相同的排名。 数据集与此类似:

 log_id    user    status    date
 1         1       a         2020-01-01
 2         1       b         2020-01-03
 3         1       a         2020-01-18
 4         1       a         2020-02-03
 5         1       c         2020-02-05
 6         2       a         2020-01-05
 7         2       c         2020-01-10
 8         2       b         2020-01-12
 9         2       a         2020-01-21
10         2       a         2020-01-23
11         2       a         2020-01-28
12         2       b         2020-01-29

我尝试通过以下方式按用户对行进行分区:

select
t.*,
rank() over (partition by t.user order by t.date) as rank_order
from table t

这将使我得到用户的日志 ID 的简单排名:

 log_id    user    status    date         rank_order
 1         1       a         2020-01-01   1
 2         1       b         2020-01-03   2
 3         1       a         2020-01-18   3
 4         1       a         2020-02-03   4
 5         1       c         2020-02-05   5
 6         2       a         2020-01-05   1
 7         2       c         2020-01-10   2
 8         2       b         2020-01-12   3
 9         2       a         2020-01-21   4
10         2       a         2020-01-23   5
11         2       a         2020-01-28   6
12         2       b         2020-01-29   7

但是,如果下一行具有相同的状态,我想给出相同的排名。 这将是这样的:

 log_id    user    status    date         desired_rank_order
 1         1       a         2020-01-01   1
 2         1       b         2020-01-03   2
 3         1       a         2020-01-18   3
 4         1       a         2020-02-03   3
 5         1       c         2020-02-05   4
 6         2       a         2020-01-05   1
 7         2       c         2020-01-10   2
 8         2       b         2020-01-12   3
 9         2       a         2020-01-21   4
10         2       a         2020-01-23   4
11         2       a         2020-01-28   4
12         2       b         2020-01-29   5

你可以做:

select *,
  sum(inc) over(partition by user order by date) as rank_order
from (
  select *,
    case when lag(status) over(partition by user order by date) = status
      then 0 else 1 end as inc   
  from t
) x

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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