【问题标题】:Fill missing dates in PostgreSQL with zero用零填充 PostgreSQL 中缺失的日期
【发布时间】:2020-01-13 19:38:45
【问题描述】:

我在 PostgreSQL 中有这样的查询:

select count(id_student) students, date_beginning_course from 
data.sessions_courses
left join my_schema.students on id_session_course=id_sesion 
where course_name='First course'
group by date_beginning_course

我通过此查询获得的是在多个日期参加过“第一门课程”课程的学生人数,例如:

Students  Date_beginning_course
____________________________________

5         2019-06-26
1         2019-06-28
5         2019-06-30
6         2019-07-01
2         2019-07-02

我想用缺失的日期值填充此表,并且对于每个缺失的值,在学生列中分配一个“0”,因为该日期没有学生。示例:

Students  Date_beginning_course
____________________________________

5         2019-06-26
0         2019-06-27  <--new row
1         2019-06-28
0         2019-06-29  <--new row
5         2019-06-30
6         2019-07-01
2         2019-07-02

你能帮帮我吗?谢谢! :)

【问题讨论】:

  • 使用calendar table(可能是generate-series())并离开它。
  • 确实如此。根据@wildplassers answer 加入使用generate_series() 创建日期范围的子查询
  • 我尝试使用 generate_series 查询没有成功,我认为我做的不正确。

标签: sql postgresql left-join gaps-and-islands date-arithmetic


【解决方案1】:

您可以使用方便的Postgres set-returning function generate_series()LEFT JOIN 生成日期列表,使用sessions_coursesstudents 表:

SELECT
    COUNT(s.id_student) students, 
    d.dt
FROM 
    (
        SELECT dt::date 
        FROM generate_series('2019-06-26', '2019-07-02', '1 day'::interval) dt
    ) d
    LEFT JOIN data.sessions_courses c 
        ON c.date_beginning_course  = d.dt 
        AND c.course_name='First course'
    LEFT JOIN my_schema.students s 
        ON s.id_session_course = c.id_session 
GROUP BY d.dt 

您可以通过修改generate_series()的前两个参数来更改日期范围。

注意:使用相关表名(或表别名)对查询中的列名进行索引是一种普遍的好习惯,因此每列属于哪个表是明确的。我相应地更改了您的查询,并且不得不做出一些您可能需要适应的假设。

【讨论】:

  • 恐怕这效果不好,因为当我在 WHERE 子句中添加更多过滤器时,我的表会返回所有结果,而不是过滤:(
  • @belfastcowboy24: 不确定你的意思......无论如何,查询中有一个错误:我刚刚删除了WHERE 子句;所有过滤条件都应放在相关LEFT JOINON 子句中。
  • @belfastcowboy24 。 . .这似乎回答了您提出的问题。你应该接受这个问题。如果您有其他问题,请将其作为问题提出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
  • 2015-10-19
  • 2015-10-09
  • 2021-09-03
  • 2022-08-15
相关资源
最近更新 更多