Postgresql 串行每日记录计数
Postgresql Serial Daily Count of Records
我正在尝试获取从 1 月 1 日至今的记录总数,不跳过日期并为没有记录的日期返回 0。
我尝试了以下方法:订单是一个例子 table 订单日期是时间戳列
with days as (
select generate_series(
date_trunc('day','2020-01-01'::timestamp),
date_trunc('day', now()),
'1 day'::interval
) as day
)
select
days.day,
count(orders.id)
from days
left outer join orders on date_trunc('day', orders.orderdate) = days.day
where orders.orders_type='C'
group by 1
问题是日期被跳过了。
但是如果我执行:
select generate_series(
date_trunc('day','2020-01-01'::timestamp),
date_trunc('day', now()),
'1 day'::interval
)
我得到了正确的系列,没有跳过任何日期。
where
条件应该属于left join
的on
子句,即:
from days
left outer join orders on date_trunc('day', orders.orderdate) = days.day
where orders.orders_type='C'
应该写成:
from days
left outer join orders
on date_trunc('day', orders.orderdate) = days.day
and orders.orders_type='C'
备注:
这里其实不需要cte,可以直接在from
子句里放generate_series()
日期连接条件可以优化为 index-friendly 表达式,避免 date_trunc()
table 别名使查询更易于读写
您可以将查询写成:
select d.day, count(o.id)
from generate_series(date '2020-01-01', now(), '1 day') as d(day)
left outer join orders o
on o.orderdate >= d.day
and o.orderdate < d.day + '1 day'::interval
and o.orders_type='C'
group by d.day
我正在尝试获取从 1 月 1 日至今的记录总数,不跳过日期并为没有记录的日期返回 0。
我尝试了以下方法:订单是一个例子 table 订单日期是时间戳列
with days as (
select generate_series(
date_trunc('day','2020-01-01'::timestamp),
date_trunc('day', now()),
'1 day'::interval
) as day
)
select
days.day,
count(orders.id)
from days
left outer join orders on date_trunc('day', orders.orderdate) = days.day
where orders.orders_type='C'
group by 1
问题是日期被跳过了。 但是如果我执行:
select generate_series(
date_trunc('day','2020-01-01'::timestamp),
date_trunc('day', now()),
'1 day'::interval
)
我得到了正确的系列,没有跳过任何日期。
where
条件应该属于left join
的on
子句,即:
from days
left outer join orders on date_trunc('day', orders.orderdate) = days.day
where orders.orders_type='C'
应该写成:
from days
left outer join orders
on date_trunc('day', orders.orderdate) = days.day
and orders.orders_type='C'
备注:
这里其实不需要cte,可以直接在
from
子句里放generate_series()
日期连接条件可以优化为 index-friendly 表达式,避免
date_trunc()
table 别名使查询更易于读写
您可以将查询写成:
select d.day, count(o.id)
from generate_series(date '2020-01-01', now(), '1 day') as d(day)
left outer join orders o
on o.orderdate >= d.day
and o.orderdate < d.day + '1 day'::interval
and o.orders_type='C'
group by d.day