Поиск всех экземпляров, в которых внешний ключ появляется несколько раз, сгруппированных по месяцам - PullRequest
0 голосов
/ 03 августа 2020

Я не слишком знаком с SQL, и мне было поручено кое-что, что я, откровенно говоря, понятия не имею, как go об этом.

Я просто собираюсь упростить таблицы до точка, в которой учитываются только необходимые поля. Таблицы выглядят следующим образом.

Submission(course(string), student(foreign_key), date-submitted)
Student(id)

Что мне нужно сделать, так это составить таблицу активных студентов за месяц для каждого курса с общим итогом. активный студент - это любой, кто подал более 4 работ в месяц . Я просматриваю только определенные c курсы, поэтому мне нужно будет жестко закодировать нужные мне значения для примера «CourseA» и «CourseB»

Результат должен быть следующим

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

Любая помощь будет принята с благодарностью

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Вы можете сделать это с двумя уровнями агрегирования: сначала по месяцам, курсам и студентам (при фильтрации по студентам, подавшим более 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
0 голосов
/ 03 августа 2020

Вы можете выполнять подзапросы, используя ключевое слово WITH, например:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...