我目前正在研究postgres,下面是我的问题。
我们有一个客户ID和该人访问物业的日期。基于此,我需要计算出行次数。连续日期被视为一次旅行。例如:如果某人在第一次约会中没有旅行,那么请先发布他连续三天访问的信息,这将被视为第二次旅行。
下面是输入
ID Date
1 1-Jan
1 2-Jan
1 5-Jan
1 1-Jul
2 1-Jan
2 2-Feb
2 5-Feb
2 6-Feb
2 7-Feb
2 12-Feb
预期输出
ID Date Trip no
1 1-Jan 1
1 2-Jan 1
1 5-Jan 2
1 1-Jul 3
2 1-Jan 1
2 2-Feb 2
2 5-Feb 3
2 6-Feb 3
2 7-Feb 3
2 12-Feb 4
我能够使用循环成功实现,但考虑到数据量,其运行速度非常慢。
能否请您提出一种无法使用循环的解决方法。
答案 0 :(得分:6)
从日期中减去一个序列-这些对于特定行程将保持不变。然后,您可以使用dense_rank()
进行编号:
select t.*,
dense_rank() over (partition by id order by grp) as trip_num
from (select t.*,
(date - row_number() over (partition by id order by date) * interval '1 day'
) as grp
from t
) t;