2015-11-25 7 views
0

У меня есть следующие SQL запрос с использованием PrestoDB:сумма составляет использование в течение каждого часа в день в течение всего дня в месяц

SELECT 
    date_trunc('month',TimeFrom) AS Month, 
    date_trunc('hour',TimeFrom) AS HourFrom, 
    date_trunc('hour',TimeTo) AS HourTo, 
    CASE 
     WHEN resource = 'c81d9eb67e93' THEN 'S' 
     WHEN resource = 'cce1eee4c73f' THEN 'L' 
     WHEN resource = 'fbc1d63e0f15' THEN 'G' 
     WHEN resource = '5ef75e433db2' THEN 'Q' 
     WHEN resource = '4b6ba65cbe14' THEN 'T' 
     WHEN resource = 'df0a8b60467d' THEN 'R' 
     WHEN resource = '013472b63651' THEN 'C' 
     WHEN resource = '7464b77d93be' THEN 'F' 
     WHEN resource = '6f1186bdbc12' THEN 'M' 
     ELSE 'other resource' 
    END AS Resource, 
    COUNT (*) AS Utilization 
FROM (SELECT 
     resource, 
     date_add('hour', i - 1, mytable.TimeFrom) AS TimeFrom, 
     date_add('hour', i, mytable.TimeFrom) AS TimeTo 
      FROM (SELECT 1 AS i UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 
       UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 
       UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 
       UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 UNION ALL SELECT 16 
       UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 UNION ALL SELECT 20 
       UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23 UNION ALL SELECT 24 
     ) AS numbers 
      INNER JOIN (SELECT 
      resource, 
      date_trunc(
       'hour', 
       FROM_UNIXTIME(timefrom) 
      ) AS TimeFrom, 
      date_trunc(
       'hour', 
       (FROM_UNIXTIME(timeto) + interval '45' minute) 
      ) AS TimeTo 
      FROM 
      reservation 
      WHERE 
      type = 'create' 
      ORDER BY 
      date_trunc(
       'day', 
       FROM_UNIXTIME(timefrom) 
      ), 
      resource) AS mytable ON numbers.i <= date_diff('hour', TimeFrom, TimeTo) 
      ORDER BY 
      TimeFrom, 
      resource) 
GROUP BY 
    date_trunc('month',TimeFrom), 
    date_trunc('hour',TimeFrom), 
    date_trunc('hour',TimeTo), 
    resource 

Он возвращает таблицу, как так:

Month | HourFrom | HourTo | Resource | Utilization 
    ["2015-08-01 00:00:00.000","2015-08-05 14:00:00.000","2015-08-05 15:00:00.000","S",4] 
    ["2015-08-01 00:00:00.000","2015-08-05 17:00:00.000","2015-08-05 18:00:00.000","Q",1] 
    ["2015-08-01 00:00:00.000","2015-08-05 17:00:00.000","2015-08-05 18:00:00.000","Q",1] 
    ["2015-08-01 00:00:00.000","2015-08-05 18:00:00.000","2015-08-05 19:00:00.000","S",5] 
    ["2015-08-01 00:00:00.000","2015-08-05 20:00:00.000","2015-08-05 21:00:00.000","Q",1] 
    ["2015-08-01 00:00:00.000","2015-08-05 21:00:00.000","2015-08-05 22:00:00.000","Q",1] 
    ["2015-08-01 00:00:00.000","2015-08-05 22:00:00.000","2015-08-05 23:00:00.000","Q",1] 
    ["2015-08-01 00:00:00.000","2015-08-06 00:00:00.000","2015-08-06 01:00:00.000","L",2] 
    ["2015-08-01 00:00:00.000","2015-08-06 00:00:00.000","2015-08-06 01:00:00.000","Q",2] 
    ["2015-08-01 00:00:00.000","2015-08-06 02:00:00.000","2015-08-06 03:00:00.000","S",3] 

Как вы можете видеть Столбцы HourFrom и HourTo разделяются по дням. Есть ли способ объединить их, чтобы у меня была сумма/общее количество каждого часа в течение всех дней в месяце?

Итак, у меня есть данные за январь & Февраль, и мы открыты только с 1 AM-4AM, и есть только 2 ресурса, тогда финальная таблица, которую я хотел бы получить, будет выглядеть примерно так (т.е. Jan1AM - Jan2AM дает мне число использования [всего] для всех дней, в течение этого периода времени в январе в одной строке):

Month | HourFrom | HourTo | Resource | Utilization 
Jan  Jan 1AM Jan 2AM  S   number 
Jan  Jan 1AM Jan 2AM  X   number 
Jan  Jan 2AM Jan 3AM  S   number 
Jan  Jan 2AM Jan 3AM  X   number 
Jan  Jan 3AM Jan 4AM  S   number 
Jan  Jan 3AM Jan 4AM  X   number 
Feb  Feb 1AM Feb 2AM  S   number 
Feb  Feb 1AM Feb 2AM  X   number 
Feb  Feb 2AM Feb 3AM  S   number 
Feb  Feb 2AM Feb 3AM  X   number 
Feb  Feb 3AM Feb 4AM  S   number 
Feb  Feb 3AM Feb 4AM  X   number 

Как бы я изменить свой первоначальный запрос, чтобы сделать что-то вроде этого?

ответ

0

Я бы начал с более простого запроса, который использует 24-часовые часы в течение часов и не утруждает себя заполнением отсутствующих часов. Это было бы:

SELECT date_trunc('month', TimeFrom) AS Month, 
     hour(TimeFrom) as HourFrom, 
     (CASE WHEN resource = 'c81d9eb67e93' THEN 'S' 
      WHEN resource = 'cce1eee4c73f' THEN 'L' 
      WHEN resource = 'fbc1d63e0f15' THEN 'G' 
      WHEN resource = '5ef75e433db2' THEN 'Q' 
      WHEN resource = '4b6ba65cbe14' THEN 'T' 
      WHEN resource = 'df0a8b60467d' THEN 'R' 
      WHEN resource = '013472b63651' THEN 'C' 
      WHEN resource = '7464b77d93be' THEN 'F' 
      WHEN resource = '6f1186bdbc12' THEN 'M' 
      ELSE 'other resource' 
     END) AS Resource, 
     COUNT(*) AS Utilization 
FROM reservation r 
WHERE type = 'create' 
GROUP BY date_trunc('month', TimeFrom), hour(TimeFrom), resource; 

Возможно, этой версии достаточно для того, что вы выполняете, чтобы выполнить.