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 joinon子句,即:

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