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是选项之一。需要进行一些调整,但效果很好。非常感谢。