计算不使用循环的行程数

0 sql postgresql gaps-and-islands

我目前正在研究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  
Run Code Online (Sandbox Code Playgroud)

预期产出

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  
Run Code Online (Sandbox Code Playgroud)

我能够成功地使用循环实现,但考虑到数据量,它的运行速度非常慢.

你能否建议我们不能使用循环的解决方法.

Gor*_*off 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;
Run Code Online (Sandbox Code Playgroud)