1

我有一张桌子,里面有物品

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 的条目,如所需输出中所述。

4

1 回答 1

2

这应该做。

我们得到所有不同的日期(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
于 2018-06-07T14:11:58.580 回答