我一直在尝试所有方法,但是到目前为止我还没有成功。
我通过以下方式获取数据。我正在使用postGreSQL
order_id | create_date
-----+--------------------
6000 | 2013-05-09 11:53:04
6001 | 2013-05-09 12:58:00
6002 | 2013-05-09 13:01:08
6003 | 2013-05-09 13:01:32
6004 | 2013-05-09 14:05:06
6005 | 2013-05-09 14:06:25
6006 | 2013-05-09 14:59:58
6007 | 2013-05-09 19:00:07
我需要一个查询,该查询生成所有24小时每小时的订单数。如果一个小时内没有订单,则默认情况下查询输出应为零。下面应该是输出格式。
orders | hour
-----+--------------------
0 | 00:00
0 | 01:00
0 | 02:00
0 | 03:00
0 | 04:00
0 | 05:00
0 | 06:00
0 | 07:00
0 | 08:00
0 | 09:00
0 | 10:00
1 | 11:00
1 | 12:00
2 | 13:00
3 | 14:00
0 | 15:00
0 | 16:00
0 | 17:00
0 | 18:00
1 | 19:00
0 | 20:00
0 | 21:00
0 | 22:00
0 | 23:00
有可能吗?以下是我当前的查询。当然,它并不能按照我想要的方式提供输出。
select count(order_id) as orders, date_trunc('hour', create_date) as hr from order_table where date_trunc('day', create_date)='2013-05-09' GROUP BY date_trunc('hour', create_date);
答案 0 :(得分:3)
您需要生成小时数。这是使用generate_series()
的一种方法:
select '00:00'::time + g.h * interval '1 hour',
count(order_id) as orders
from generate_series(0, 23, 1) g(h) left join
order_table ot
on extract(hour from create_date) = g.h and
date_trunc('day', create_date) = '2013-05-09'
group by g.h
order by g.h;
或者:
select g.dte, count(order_id) as orders
from generate_series('2013-05-09'::timestamp, '2013-05-09 23:00:00'::timestamp, interval '1 hour') g(dte) left join
order_table ot
on g.dte = date_trunc('hour', create_date)
group by g.dte
order by g.dte;
答案 1 :(得分:0)
使用数字CTE(以Postgresql为例):
with Nums(NN) as
(
values(0)
union all
select NN+1
where NN <23
)
select NN as the_hour, count(order_id) as orders
from Nums
left join order_table
on date_part('hour',create_date) = NN
group by NN
答案 2 :(得分:0)
我还能给出答案吗?测试,测试,哦,是的,它有效。好的,我认为您查询中的问题是您的比较错误:date_trunc('day', create_date)='2013-05-09'
应该是:date_trunc('day', create_date)='2013-05-09 00:00:00'
。像这样:
SELECT COUNT(order_id) as orders,
date_trunc('hour',create_date) as hr
FROM order_table
WHERE date_trunc('day', create_date) = '2013-05-09 00:00:00'
GROUP BY date_trunc('hour',create_date);
这不会返回零计数,但是其他人已经解决了该问题。