Sql 填写空日期

Sql 填写空日期,sql,postgresql,Sql,Postgresql,此查询返回在特定日期范围内按天创建的报警数 SELECT CAST(created_at AS DATE) AS date, SUM(1) AS count FROM ew_alarms LEFT JOIN site ON site.id = ew_alarms.site_id AND ew_alarms.created_at BETWEEN '12/22/2020' AND '01/22/2021' AND (CAST(EXTRACT(HOUR FROM ew_alarms.created_a

此查询返回在特定日期范围内按天创建的报警数

SELECT CAST(created_at AS DATE) AS date, SUM(1) AS count
FROM ew_alarms
LEFT JOIN site ON site.id = ew_alarms.site_id
AND ew_alarms.created_at BETWEEN '12/22/2020' AND '01/22/2021' AND (CAST(EXTRACT(HOUR FROM ew_alarms.created_at) AS INT) BETWEEN 0 AND 23.99)
GROUP BY CAST(created_at AS DATE)
ORDER BY date DESC
结果:

填写缺失日期(1/16、1/17、1/18等)的最佳方式是什么?由于在那些日子里没有产生警报,这些结果偏离了我最终想要达到的每日平均值


这是一个
generate\u series
查询吗?

是的,使用
generate\u series()
。我建议:

SELECT gs.date, COUNT(s.site_id) AS count
FROM GENERATE_SERIES('2020-12-22'::date, '2021-01-22'::date, INTERVAL '1 DAY') gs(dte) LEFT JOIN
     ew_alarms a
     ON ew.created_at >= gs.dte AND
        ew.created_at < gs.dte + INTERVAL '1 DAY' LEFT JOIN
     site s
     ON s.id = a.site_id 
GROUP BY gs.dte
ORDER BY date DESC;
选择gs.date,COUNT(s.site\u id)作为COUNT
从生成_系列('2020-12-22':日期,'2021-01-22':日期,间隔'1天')gs(dte)左连接
ew_警报a
在ew.created_at>=gs.dte和
ew.created_在
我不知道小时比较应该做什么。小时总是在0到23之间,所以我去掉了这个逻辑


注意:您可能想从
站点
ew_报警
中计算一些东西。
LEFT JOIN
s会出现这种情况,因此可以返回
0

递归CTE是选项之一。需要进行一些调整,但效果很好。非常感谢。