在不使用循环的情况下计算行程数

时间:2018-09-04 07:34:01

标签: 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  

预期输出

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  

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

能否请您提出一种无法使用循环的解决方法。

1 个答案:

答案 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;