我有下表mytable
在 hive 中:
id radar_id car_id datetime
1 A21 123 2017-03-08 17:31:19.0
2 A21 555 2017-03-08 17:32:00.0
3 A21 777 2017-03-08 17:33:00.0
4 B15 123 2017-03-08 17:35:22.0
5 B15 555 2017-03-08 17:34:05.0
5 B15 777 2017-03-08 20:50:12.0
6 A21 123 2017-03-09 11:00:00.0
7 C11 123 2017-03-09 11:10:00.0
8 A21 123 2017-03-09 11:12:00.0
9 A21 555 2017-03-09 11:12:10.0
10 B15 123 2017-03-09 11:14:00.0
11 C11 555 2017-03-09 11:20:00.0
我想获取汽车通过雷达的路线
A21
和 B15
同一行程内。例如,如果同一 car_id
的日期不同,那就是不一样的行程了。基本上,我想考虑雷达之间的最大时间差A21
和 B15
同一辆车应该是30分钟。如果它更大,那么行程就不一样了,例如 car_id
777
.我的最终目标是计算每天的平均出行次数(非唯一,所以如果同一辆车在同一路线上经过 2 次,那么应该计算 2 次)。
预期结果如下:
radar_start radar_end avg_tripscount_per_day
A21 B15 1.5
日期
2017-03-08
雷达之间有 2 次行程 A21
和 B15
(汽车 777
由于 30 分钟限制不考虑),而在日期 2017-03-09
只有1趟。平均每天 2+1=1.5 次。我怎样才能得到这个结果?基本上,我不知道如何在查询中引入 30 分钟限制以及如何按
radar_start
对乘车进行分组。和 radar_end
.谢谢。
更新:
A21
在 2017-03-08 23:55
和雷达 B15
在 2017-03-09 00:15
,那么它应该被认为是在日期2017-03-08
登记的同一次旅行。 . ids
6和8同车123
路过 A21
两次,然后转向B15
( id
10)。最后一次乘坐 id
8 应该考虑。所以,8-10
.因此,最接近 B15
的前一个.解释是有车经过A21
两次,第二次转向B15
. 最佳答案
select count(*) / count(distinct to_date(datetime)) as trips_per_day
from (select radar_id
,datetime
,lead(radar_id) over w as next_radar_id
,lead(datetime) over w as next_datetime
from mytable
where radar_id in ('A21','B15')
window w as
(
partition by car_id
order by datetime
)
) t
where radar_id = 'A21'
and next_radar_id = 'B15'
and datetime + interval '30' minutes >= next_datetime
;
+----------------+
| trips_per_day |
+----------------+
| 1.5 |
+----------------+
附言
如果您的版本不支持间隔,最后的代码记录可以替换为 -
and to_unix_timestamp(datetime) + 30*60 > to_unix_timestamp(next_datetime)
关于sql - 如何从历史数据中检索行程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45481288/