我目前正在研究 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/