首页 > 解决方案 > 填写空日期

问题描述

此查询返回特定日期范围之间按天创建的警报数。

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_series查询吗?

标签: sqlpostgresql

解决方案


是的,使用generate_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;

我不知道小时比较应该做什么。小时总是在 0 到 23 之间,所以我删除了那个逻辑。

注意:大概,您想从site或中计算一些东西ew_alarms。这是 s 所期望的,LEFT JOIN因此0可以返回。


推荐阅读