我有这张桌子
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的记录,我没有得到那条线。但是我想。我没有“发明”2017-01-08的日期,有确定的日期记录(但不同的类型)。
我尝试了一些coalesce和子查询但是没有太多的东西,主要是因为我有两个字段和coalesce在我看来工作正常只有一个。
我也试过CASE
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;
也没用。我很确定这是一个非常混乱的查询。
你碰巧对我有什么建议吗?
谢谢 马可
答案 0 :(得分:1)
您可以使用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
答案 1 :(得分:1)
试试这个:
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;