2017-02-13 4 views
0

Итак, у меня есть таблица, где у каждого user_id есть operation_timestamp. Чтобы проверить, как долго Акция для каждого user_id я использую запрос max(operation_timestamp)-min(operation_timestamp), который затем преобразовать в десятичные, так скажем я получаю результат:Сумма времени для каждого user_id

SHIFT USER ID  MIN   MAX  MAX-MIN DECIMAL 
    shift1 user_1  08:19:42 09:55:20 01:35:37  1.59 
    shift2 user_2  10:04:27 10:28:22 00:23:54  0.40 
    shift2 user_3  10:44:07 10:55:58 00:01:51  0.04 
    shift2 user_4  06:25:33 10:51:52 04:26:19  4.44 

Теперь мой вопрос: , как я могу работать сумму времени в десятичных знаков поэтому у меня есть общее время на активность для всех пользователей? Что-то вроде этого:

SHIFT  TOTAL_DECIMAL 
    shift1  1.59 
    shift2  4.88 

Я попробовал то же запрос, но без group by user_id функции, но затем вычислительной макс и мин, не глядя на отдельном user_id, так что сказать, что это будет вычислять shift2 суммы в 06:25:33 (user_4) to 10:55:58 (user_3), который даст результат от 4.45 по десятичным знакам.

Это запрос, я использую без успеха:

select 
case 
when SUBSTR(a.operation_ts,12,13) between '00:00:00.000' and '05:59:59.000' then 'Nights' 
when SUBSTR(a.operation_ts,12,13) between '06:00:00.000' and '13:59:59.000' then 'Days' 
when SUBSTR(a.operation_ts,12,13) between '14:00:00.000' and '21:59:59.000' then 'Lates' 
when SUBSTR(a.operation_ts,12,13) between '22:00:00.000' and '23:59:59.000' then 'Nights' 
else 'other' 
end as shift, 
a.userid, 
substr(min(a.operation_ts),11,9), 
substr(max(a.operation_ts),11,9), 
substr((max(a.operation_ts)-min(a.operation_ts)),10,9) as time_on_go, 
round(((substr((max(a.operation_ts)-min(a.operation_ts)),11,2))*3600+(substr((max(a.operation_ts)-min(a.operation_ts)),14,2))*60+(substr((max(a.operation_ts)-min(a.operation_ts)),17,2)))/3600,2) time_decimal 
from dc_sys_common:user_operation a 
where a.activity_code = 1012 
and date(a.operation_ts) between today and today+1 
and SUBSTR(a.operation_ts,12,9) between '00:00:00' and '21:59:59' 
group by userid, shift 
having max(a.operation_ts)-min(a.operation_ts)>'0 00:00:01.000' 
order by shift asc 

ответ

1

сделать GROUP BY SHIFT на свой первый запрос будучи вложенными:

SELECT `SHIFT`, SUM(`DECIMAL`) 
FROM 
(
    -- your query here 
) 
GROUP BY `SHIFT` 
+0

Пробовал, но это дает мне ошибку: 'Не может быть агрегатов внутри агрегатов.' – user7557185

+0

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

0

Я думаю, вам нужно два уровня агрегации за то, что хотят делать, один на уровне user_id и shift, а второй на уровне shift:

select shift, 
from (select case when SUBSTR(a.operation_ts,12,13) between '00:00:00.000' and '05:59:59.000' then 'Nights' 
        when SUBSTR(a.operation_ts,12,13) between '06:00:00.000' and '13:59:59.000' then 'Days' 
        when SUBSTR(a.operation_ts,12,13) between '14:00:00.000' and '21:59:59.000' then 'Lates' 
        when SUBSTR(a.operation_ts,12,13) between '22:00:00.000' and '23:59:59.000' then 'Nights' 
        else 'other' 
      end) as shift, 
      a.userid, 
      round(((substr((max(a.operation_ts)-min(a.operation_ts)),11,2))*3600+(substr((max(a.operation_ts)-min(a.operation_ts)),14,2))*60+(substr((max(a.operation_ts)-min(a.operation_ts)),17,2)))/3600,2 
       ) time_decimal 
     from dc_sys_common:user_operation a 
     where a.activity_code = 1012 and 
      date(a.operation_ts) between today and today+1 and 
      SUBSTR(a.operation_ts,12,9) between '00:00:00' and '21:59:59' 
     group by userid, shift 
     having max(a.operation_ts)-min(a.operation_ts)>'0 00:00:01.000' 
    ) us 
group by shift asc; 
+0

Это тоже не работает. – user7557185

Смежные вопросы