用零填充 PostgreSQL 中缺失的日期

bel*_*y24 4 sql postgresql left-join date-arithmetic gaps-and-islands

我在 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
Run Code Online (Sandbox Code Playgroud)

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

Students  Date_beginning_course
____________________________________

5         2019-06-26
1         2019-06-28
5         2019-06-30
6         2019-07-01
2         2019-07-02
Run Code Online (Sandbox Code Playgroud)

我想用缺失的日期值填充此表,并且对于每个缺失的值,在“学生”列中指定“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
Run Code Online (Sandbox Code Playgroud)

你可以帮帮我吗?谢谢!:)

GMB*_*GMB 6

您可以使用方便的Postgres 设置返回函数generate_series()及其LEFT JOINsessions_courses和表生成日期列表students

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 
Run Code Online (Sandbox Code Playgroud)

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

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