sql - 如何从历史数据中检索行程?

标签 sql hive hiveql

我有下表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

我想获取汽车通过雷达的路线A21B15同一行程内。例如,如果同一 car_id 的日期不同,那就是不一样的行程了。基本上,我想考虑雷达之间的最大时间差A21B15同一辆车应该是30分钟。如果它更大,那么行程就不一样了,例如 car_id 777 .

我的最终目标是计算每天的平均出行次数(非唯一,所以如果同一辆车在同一路线上经过 2 次,那么应该计算 2 次)。

预期结果如下:
radar_start   radar_end       avg_tripscount_per_day
A21           B15             1.5

日期2017-03-08雷达之间有 2 次行程 A21B15 (汽车 777 由于 30 分钟限制不考虑),而在日期 2017-03-09只有1趟。平均每天 2+1=1.5 次。

我怎样才能得到这个结果?基本上,我不知道如何在查询中引入 30 分钟限制以及如何按 radar_start 对乘车进行分组。和 radar_end .

谢谢。

更新:
  • 行程在开始日期登记。
  • 如果汽车被雷达触发 A212017-03-08 23:55和雷达 B152017-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/

    相关文章:

    hadoop - HIVE 查询问题(选择计数 (*))

    hadoop - derby 中的 Hive Metastore 与 Hive/Warehouse 中的 Hive Metastore 有什么区别?

    c++ - 在 C++ 中获取数据库连接

    php - 将一周添加到以 YYYYMMDD 格式存储的 SQL 值

    java - Java中两个异构系统的数据验证

    scala - Spark 查询 : unclosed character literal

    json - 如何使用Hive sQL将ngrams数组字符串和测试频率作为hive表中的单独元素获取?

    hadoop - 配置单元错误:任务已被ExecutorService拒绝

    MySQL 问题 : Table 'data_dictionary.CHARACTER_SETS' doesn't exist

    PHP、MySQL 和 jQuery : Display select options dynamically