没有数据时也提取日期值

时间:2017-01-16 16:56:55

标签: sql postgresql coalesce

我有这张桌子

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;

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

你碰巧对我有什么建议吗?

谢谢 马可

2 个答案:

答案 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;