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