【问题标题】:Subtract /Loop through rows in HIVE Query通过 HIVE 查询中的行减去/循环
【发布时间】:2020-08-21 21:36:08
【问题描述】:

我在下面的表格中有一个数据

ID  status      timestamp
ABC login       1/1/2020 12:00
ABC lock        1/1/2020 13:19
ABC unlock      1/1/2020 13:52
ABC Disconnect  1/1/2020 15:52
ABC Reconnect   1/1/2020 15:55
ABC lock        1/1/2020 16:25
ABC unlock      1/1/2020 16:30
ABC logoff      1/1/2020 17:00
ABC login       2/1/2020 12:00
ABC lock        2/1/2020 13:19
ABC unlock      2/1/2020 13:52
ABC lock        2/1/2020 16:22
ABC logoff      2/1/2020 17:00

我需要找到员工在特定日期实际工作的有效工作时间。表示总时间减去状态为锁定、断开连接的时间的总和。

示例:对于 2020 年 1 月 1 日的员工 ABC,他的系统在 13:19 - 13:52(33 分钟)和 15:52 - 15:55(3 分钟)之间是理想的。 因此,在总工作时间中,即...... 5 小时(登录和注销时间之间的时间),他的有效时间将是 5 小时 - 36 分钟 = 4 小时 24 分钟。 2020 年 2 月 1 日也是如此。

【问题讨论】:

    标签: sql date group-by hive hiveql


    【解决方案1】:

    你可以使用窗口函数,然后聚合:

    select 
        id,
        to_date(timestamp) timestamp_day,
        sum(case when status in ('lock', 'disconnect') then - duration else duration end) / 60 / 60 hours_worked
    from (
        select t.*, 
            lead(timestamp) over(partition by id order by timestamp)
                - unix_timestamp(timestamp) status_duration
        from mytable t
    ) t
    group by id, to_date(timestamp)
    order by id, to_date(timestamp)
    

    在子查询中,我们使用lead() 来检索“下一步”动作的时间戳,因此我们可以计算当前步骤的持续时间。外部查询按员工和日期聚合,并根据您的业务规则进行工作时间的最终计算。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多