Перекрестное соединение для запроса postgresql временного ряда - PullRequest
0 голосов
/ 07 июня 2018

У меня есть таблица с пунктами с

Item_id,  Item_time,             Item_numbers
  1       2017-01-01 18:00:00       2
  2       2017-01-01 18:10:00       2
  3       2017-01-01 19:10:00       3

. Я хочу сгруппировать элементы по часам в течение некоторого определенного времени (от 9 до 3 для каждого дня) и в случае, если нет записи дляв определенные часы это должно быть 0.

Требуемый результат:

            Item_time          Item_numbers
         2017-01-01 18:00:00       4
         2017-01-01 19:00:00       3 
         2017-01-01 20:00:00       0    



with hour_items as (select date_trunc('hour', item_time) "hour",
avg(item_numbers) as value from items where item_id=2 and
fact_time::date= '2017-01-01' group by hour) select hour, value from
hour_items where EXTRACT(HOUR FROM hour) >= '9' and EXTRACT(HOUR FROM
> hour) < '15'.

Приведенный выше запрос группирует их правильно, но там, где отсутствует час, нет записи.Хотя это должна быть запись с 0, как указано в желаемом выводе.

1 Ответ

0 голосов
/ 07 июня 2018

Это должно сделать.

Мы получаем все отдельные дни (даты CTE), затем мы генерируем часы для каждой из этих дат (часы CTE), и, наконец, мы оставляем объединение наших данных на основе "для наших".

with sample_data as (
    select 1 as item_id, '2018-01-01 12:03:15'::timestamp as item_time, 2 as item_numbers
    union all
    select 2 as item_id, '2018-01-01 12:41:15'::timestamp as item_time, 1 as item_numbers
    union all
    select 3 as item_id, '2018-01-01 17:41:15'::timestamp as item_time, 2 as item_numbers
    union all
    select 4 as item_id, '2018-01-01 19:41:15'::timestamp as item_time, 2 as item_numbers
),
dates as (
    select distinct item_time::date
    from sample_data
),
hours as (
    select item_time + interval '1 hour' * a as hour
    from dates
    cross join generate_series(0,23) a
)
select h.hour, sum(coalesce(sd.item_numbers,0))
from hours h
left join sample_data sd on h.hour = date_trunc('hour', sd.item_time)
where extract(hour from hour) between 9 and 17
group by h.hour
order by h.hour
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...