在没有数据时也提取日期值
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;
我有这个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;