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