Changes between Version 4 and Version 5 of Analytical and statistical querying


Ignore:
Timestamp:
09/30/25 21:44:04 (13 days ago)
Author:
206046
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Analytical and statistical querying

    v4 v5  
    11= Analytical and statistical querying =
    22
    3 == Find the Students Who Scored Below Average on Assignments ==
     3== dentify At-Risk Students Based on Attendance and Grades (multi-metric scoring system) ==
    44
    55{{{#!sql
    6 SELECT s.id_student, u.username, sub.progress_score
    7 FROM Submission sub
    8 JOIN Student s ON sub.id_student = s.id_student
     6WITH student_attendance AS (
     7    SELECT
     8        id_student,
     9        COUNT(*) AS total_classes,
     10        COUNT(*) FILTER (WHERE attended = TRUE) AS attended_classes
     11    FROM Attendance
     12    GROUP BY id_student
     13),
     14student_grades AS (
     15    SELECT
     16        id_student,
     17        AVG(progress_score) AS avg_score
     18    FROM Submits
     19    GROUP BY id_student
     20),
     21student_risk_score AS (
     22    SELECT
     23        a.id_student,
     24        (attended_classes * 1.0 / NULLIF(total_classes, 0)) AS attendance_rate,
     25        g.avg_score,
     26        CASE
     27            WHEN (attended_classes * 1.0 / NULLIF(total_classes, 0)) < 0.5 AND g.avg_score < 60 THEN 'High Risk'
     28            WHEN (attended_classes * 1.0 / NULLIF(total_classes, 0)) < 0.7 OR g.avg_score < 70 THEN 'Medium Risk'
     29            ELSE 'Low Risk'
     30        END AS risk_level
     31    FROM student_attendance a
     32    JOIN student_grades g ON a.id_student = g.id_student
     33)
     34SELECT
     35    s.id_student,
     36    u.username,
     37    attendance_rate,
     38    avg_score,
     39    risk_level
     40FROM student_risk_score r
     41JOIN Student s ON r.id_student = s.id_student
    942JOIN User u ON s.id_user = u.id_user
    10 WHERE sub.progress_score < (SELECT AVG(progress_score) FROM Submission);
     43ORDER BY risk_level DESC, avg_score ASC;
     44
    1145}}}
    1246
     
    1448
    1549{{{#!sql
    16 SELECT s.id_student, u.username,
    17        (COUNT(a.attended) FILTER (WHERE a.attended = TRUE) * 100.0 / COUNT(*)) AS attendance_rate
    18 FROM Attendance a
    19 JOIN Student s ON a.id_student = s.id_student
    20 JOIN User u ON s.id_user = u.id_user
    21 GROUP BY s.id_student, u.username
    22 HAVING (COUNT(a.attended) FILTER (WHERE a.attended = TRUE) * 100.0 / COUNT(*)) < 50;
     50
    2351}}}
    2452
     
    2654
    2755{{{#!sql
    28 SELECT c.id_Course, s.name AS subject_name, COUNT(e.id_enrollment) AS total_enrollments
    29 FROM Enrollment e
    30 JOIN Course c ON e.id_Course = c.id_Course
    31 JOIN Subject_Course sc ON c.id_Course = sc.id_Course
    32 JOIN Subject s ON sc.id_subject = s.id_subject
    33 GROUP BY c.id_Course, s.name
    34 ORDER BY total_enrollments DESC
    35 LIMIT 1;
     56
    3657}}}
    3758
    3859== Get the Percentage of Students Who Completed a Course ==
    3960{{{#!sql
    40 SELECT c.id_Course, s.name AS subject_name,
    41        COUNT(CASE WHEN e.status = 'Completed' THEN 1 END) * 100.0 / COUNT(*) AS completion_rate
    42 FROM Enrollment e
    43 JOIN Course c ON e.id_Course = c.id_Course
    44 JOIN Subject_Course sc ON c.id_Course = sc.id_Course
    45 JOIN Subject s ON sc.id_subject = s.id_subject
    46 GROUP BY c.id_Course, s.name;
     61
    4762}}}
    4863
     
    5065
    5166{{{#!sql
    52 SELECT c.id_Course, s.name AS subject_name,
    53        AVG(sub.progress_score) AS course_avg_score,
    54        (SELECT AVG(progress_score) FROM Submission) AS overall_avg_score
    55 FROM Submission sub
    56 JOIN Enrollment e ON sub.id_student = e.id_student
    57 JOIN Course c ON e.id_Course = c.id_Course
    58 JOIN Subject_Course sc ON c.id_Course = sc.id_Course
    59 JOIN Subject s ON sc.id_subject = s.id_subject
    60 GROUP BY c.id_Course, s.name;
     67
    6168}}}
    6269
     
    6471
    6572{{{#!sql
    66 SELECT
    67     t.id_teacher,
    68     u.username AS teacher_name,
    69     s.id_subject,
    70     s.name AS subject_name,
    71     AVG(r.rating) AS avg_rating,
    72     RANK() OVER (PARTITION BY s.id_subject ORDER BY AVG(r.rating) DESC) AS rank
    73 FROM Rating r
    74 JOIN Teacher t ON r.id_teacher = t.id_teacher
    75 JOIN User u ON t.id_user = u.id_user
    76 JOIN Course c ON t.id_teacher = c.created_by
    77 JOIN Subject_Course sc ON c.id_Course = sc.id_Course
    78 JOIN Subject s ON sc.id_subject = s.id_subject
    79 GROUP BY t.id_teacher, u.username, s.id_subject, s.name
    80 ORDER BY avg_rating DESC;
     73
    8174}}}
    8275