sql - 不使用循环计算行程次数

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

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

能否请您提出一个我们不能使用循环的解决方法。

最佳答案

从日期中减去一个序列——这些对于特定的旅行来说将是不变的。然后你可以使用 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;

关于sql - 不使用循环计算行程次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52161094/

相关文章:

postgresql - 无论如何都无法获得关系的权限

sql - 如何将此 mysql 查询转换为 postgres 9.4

sql - 基于条件的数量

sql - T-SQL 按条件对数据进行分组

mysql - 计算每行中由特殊符号字符串分隔的数量,而不使用任何其他表或存储过程

mysql - 检索每组中的最后一条记录 - MySQL

mysql - 从 MySQL 中的每小时集中选择 30 个 EOD 记录

mysql - 存储过程中的事务

sql - 减少 SQL 中的提取时间(索引已经完成)

Mysql 差距和孤岛问题?