Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 通过配置单元查询中的行进行减法/循环_Sql_Date_Group By_Hive_Hiveql - Fatal编程技术网

Sql 通过配置单元查询中的行进行减法/循环

Sql 通过配置单元查询中的行进行减法/循环,sql,date,group-by,hive,hiveql,Sql,Date,Group By,Hive,Hiveql,我在下面的表格中有一个数据 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

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

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日类似。

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

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()
检索“下一步”操作的时间戳,以便计算当前步骤的持续时间。外部查询按员工和日期进行聚合,并根据您的业务规则进行工作时间的最终计算。

您可以使用窗口功能,然后进行聚合:

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()
检索“下一步”操作的时间戳,以便计算当前步骤的持续时间。外部查询按员工和日期进行聚合,并根据业务规则最终计算工作时间