Вычесть / L oop по строкам в запросе HIVE - PullRequest
1 голос
/ 06 мая 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

Мне нужно найти эффективное рабочее время сотрудника на конкретную дату, на которую он действительно работал. Означает сумму общего времени за вычетом времени, когда статус был заблокирован, отключен.

Пример: для сотрудника AB C на 01-ЯНВ-2020 его система была идеальной между 13:19 - 13:52 (33 минут) и снова с 15:52 - 15:55 (3 минуты). Следовательно, из общего рабочего часа, т.е. 5 часов (время между входом в систему и временем выхода из системы), его эффективное время составит 5 часов - 36 минут = 4 часа 24 минуты. Аналогично для 01-ФЕВ-2020.

1 Ответ

0 голосов
/ 06 мая 2020

Вы можете использовать оконные функции, а затем агрегирование:

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() для получения метки времени «следующего» действия, чтобы мы могли вычислить продолжительность текущего шаг. Внешний запрос агрегирует по сотрудникам и дням и выполняет окончательный расчет рабочего времени в соответствии с вашим бизнес-правилом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...