在没有数据时也提取日期值

Extract date-by-date values also when no data

我有这个table

records
- id
- date
- typology

我想提取类型学 = 999 的记录的每日计数。我知道每天至少有 1 条记录,但大多数时候我没有类型学 999 的记录。

我试过

select count(*) from records where typology = 999 and date > '2017-01-01' group by date order by date asc;

希望得到类似的东西

285 | 2017-01-06 |
307 | 2017-01-07 |
  0 | 2017-01-08 |
316 | 2017-01-09 |

但我不知道。我得到

285 | 2017-01-06 |
307 | 2017-01-07 |
316 | 2017-01-09 |

没错。由于在 1 月 8 日没有类型为 999 的记录,所以我没有得到该行。但我愿意。我不必 "invent" 2017-01-08 日期,肯定有该日期的记录(但类型不同)。

我尝试了一些合并和子查询,但没有得到太多,主要是因为我有两个字段,而合并在我看来只用一个就可以正常工作。

我也试过一个案例

SELECT CASE c WHEN NULL THEN 0 ELSE c END
FROM (
select count(*) as c from records where typology = 892 and date > '2017-01-01' group by date order by date asc
) as s;

也没用。我很确定这是一个非常混乱的查询。

你对我有什么建议吗?

谢谢 马可

您可以使用generate_series 生成指定开始和结束之间的所有日期。然后 left join 计算缺失日期的 0

select d.dt,coalesce(r.cnt,0) as cnt    
from (select * 
      from generate_series('2017-01-02'::date,'2017-12-31'::date,'1 day') as dt) d
     --change the start and end date,interval in generate_series as required
left join (select date,count(*) as cnt
           from records 
           where typology = 892 and date > '2017-01-01'
           group by date) r
on r.date=d.dt

试试这个:

select t.date,
  count(r.date)
from records r
right join
  ( select date from records where date > '2017-01-01' group by date
  ) t
on r.date      = t.date
and r.typology = 999
group by t.date
order by t.date asc;