Sql 查找按月份分组的外键多次出现的所有实例

Sql 查找按月份分组的外键多次出现的所有实例,sql,postgresql,Sql,Postgresql,我对SQL不太熟悉,而且我一直在做一些事情,坦率地说,我不知道如何去做 我只是将表简化到只考虑必要字段的程度。 这些表格如下所示 Submission(course(string), student(foreign_key), date-submitted) Student(id) 我需要做的是每月生成一个活跃学生表,每个课程有一个总数。活跃学生是指当月提交超过4份申请的任何人。我只看具体的课程,所以我需要硬编码我需要的值,以“CourseA”和“CourseB”为例 结果如下 month |

我对SQL不太熟悉,而且我一直在做一些事情,坦率地说,我不知道如何去做

我只是将表简化到只考虑必要字段的程度。 这些表格如下所示

Submission(course(string), student(foreign_key), date-submitted)
Student(id)
我需要做的是每月生成一个活跃学生表,每个课程有一个总数。活跃学生是指当月提交超过4份申请的任何人。我只看具体的课程,所以我需要硬编码我需要的值,以“CourseA”和“CourseB”为例

结果如下

month | courseA | CourseB | Total
------------------------------------------
03/2020    50       27        77
02/2020    25       12        37
01/2020    43       20        63

非常感谢您的任何帮助

您可以使用带有以下关键字的
进行子查询:

WITH monthsA AS (
    SELECT to_char(date-submitted, "MM/YYYY") as month, course, COUNT(*) as students
    FROM Submission
    WHERE course = 'courseA'
    GROUP BY 1, 2
),  monthsB AS (
    SELECT to_char(date-submitted, "MM/YYYY") as month, course, COUNT(*) AS students
    FROM Submission
    WHERE course = 'courseB'
    GROUP BY 1, 2
)
SELECT ma.month,
       COALESE(ma.students, 0) AS courseA,
       COALESCE(mb.students) AS courseB,
       COALESCE(ma.students, 0) + COALESCE(mb.students, 0) AS Total
FROM monthsA ma
LEFT JOIN monthsB mb ON ma.month = mb.month
ORDER BY 1 DESC

您可以通过两个级别的聚合实现这一点:首先按月份、课程和学生进行聚合(同时筛选提交超过4份报告的学生),然后按月份进行聚合(同时旋转数据集):


非常感谢,这让我免于数小时的痛苦。
select
    month_submitted,
    count(*) filter(where course = 'courseA') active_students_in_courseA,
    count(*) filter(where course = 'courseB') active_students_in_courseB,
    count(*) total
from (
    select 
        date_trunc('month', date_submitted) month_submitted,
        course,
        student_id,
        count(*) no_submissions
    from submission
    where course in ('courseA', 'courseB')
    group by 1, 2, 3
    having count(*) > 4
) t
group by 1