我在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
你能帮我吗?谢谢! :)
答案 0 :(得分:2)
您可以使用方便的Postgres set-returning function generate_series()
和LEFT JOIN
以及sessions_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
您可以通过修改generate_series()
的前两个参数来更改日期范围。
NB:通常,建议使用相关的表名(或表别名)为查询中的列名建立索引,因此很明显每列都属于哪个表。我相应地更改了您的查询,并且不得不做出一些假设,您可能需要进行调整。