DatabaseCreation: pure_views.sql

File pure_views.sql, 16.9 KB (added by 231082, 4 days ago)

Non-analytical VIEWs.

Line 
1
2
3----------
4CREATE OR REPLACE VIEW v_student_current_semester AS
5SELECT
6 s.id AS student_id,
7 s.index,
8 ce.id AS course_enrollment_id,
9 c.code AS course_code,
10 c.name AS course_name,
11 c.credits,
12 ed.academic_year,
13 ed.semester AS edition_semester,
14
15
16 STRING_AGG(
17 m.name || ' ' || m.surname, ', '
18 ORDER BY m.surname
19 ) AS teachers,
20 sg.grade AS current_grade,
21 sg.graded_at
22FROM Student s
23 JOIN Semester_Enrollment se
24 ON se.program_enrollment_id IN (
25 SELECT id FROM Program_Enrollment WHERE student_id = s.id
26 )
27 AND se.academic_year = 2025
28 AND se.semester::int = 1
29 JOIN Course_Enrollment ce
30 ON ce.semester_enrollment_id = se.id
31 JOIN Course_Edition ed
32 ON ed.id = ce.course_edition_id
33 JOIN Course c
34 ON c.code = ed.course_code
35 LEFT JOIN Teaches t
36 ON t.course_edition_id = ed.id
37 LEFT JOIN Teacher tr
38 ON tr.id = t.teacher_id
39 LEFT JOIN Member m
40 ON m.id = tr.id
41 LEFT JOIN Student_Grade sg
42 ON sg.course_enrollment_id = ce.id
43GROUP BY
44 s.id, s.index, ce.id, c.code, c.name, c.credits,
45 ed.academic_year, ed.semester, sg.grade, sg.graded_at;
46
47
48
49
50----------
51CREATE OR REPLACE VIEW v_student_upcoming_deadlines AS
52SELECT
53 ce.id AS course_enrollment_id,
54 s.id AS student_id,
55 c.name AS course_name,
56 'Exercise' AS item_type,
57 ex.title AS item_title,
58 ex.deadline::timestamp AS due_at,
59 ex.max_grade,
60
61
62 CASE WHEN esub.id IS NOT NULL THEN true ELSE false END
63 AS submitted
64FROM Course_Enrollment ce
65 JOIN Semester_Enrollment se ON se.id = ce.semester_enrollment_id
66 JOIN Program_Enrollment pe ON pe.id = se.program_enrollment_id
67 JOIN Student s ON s.id = pe.student_id
68 JOIN Course_Edition ed ON ed.id = ce.course_edition_id
69 JOIN Course c ON c.code = ed.course_code
70 JOIN Exercise ex ON ex.course_edition_id = ed.id
71 LEFT JOIN Exercise_Submission esub
72 ON esub.exercise_id = ex.id
73 AND esub.course_enrollment_id = ce.id
74WHERE ex.deadline >= CURRENT_DATE
75
76UNION ALL
77
78SELECT
79 ce.id,
80 s.id,
81 c.name,
82 'Exam',
83 'Exam — ' || ed.academic_year::text || ' S' || ed.semester::int::text,
84 ex2.scheduled_at,
85 NULL,
86 CASE WHEN ea.course_enrollment_id IS NOT NULL THEN true ELSE false END
87FROM Course_Enrollment ce
88 JOIN Semester_Enrollment se ON se.id = ce.semester_enrollment_id
89 JOIN Program_Enrollment pe ON pe.id = se.program_enrollment_id
90 JOIN Student s ON s.id = pe.student_id
91 JOIN Course_Edition ed ON ed.id = ce.course_edition_id
92 JOIN Course c ON c.code = ed.course_code
93 JOIN Exam ex2 ON ex2.course_edition_id = ed.id
94 LEFT JOIN Exam_Attempt ea
95 ON ea.exam_id = ex2.id
96 AND ea.course_enrollment_id = ce.id
97WHERE ex2.scheduled_at >= CURRENT_TIMESTAMP
98
99ORDER BY due_at;
100
101
102
103
104----------
105CREATE OR REPLACE VIEW v_student_transcript AS
106SELECT
107 pe.student_id,
108 s.index,
109 ap.name AS program_name,
110 ap.code AS program_code,
111 se.academic_year,
112 se.semester::int AS semester,
113 c.code AS course_code,
114 c.name AS course_name,
115 c.credits,
116 cur.mandatory,
117 cur.semester::int AS curriculum_semester,
118 sg.grade::int AS grade,
119 sg.graded_at,
120 CASE
121 WHEN sg.grade IS NOT NULL THEN 'passed'
122 WHEN se.academic_year = 2025 AND se.semester::int = 1 THEN 'in_progress'
123 ELSE 'failed'
124 END AS outcome
125FROM Program_Enrollment pe
126 JOIN Student s ON s.id = pe.student_id
127 JOIN Academic_Program ap ON ap.code = pe.academic_program_code
128 JOIN Semester_Enrollment se ON se.program_enrollment_id = pe.id
129 JOIN Course_Enrollment ce ON ce.semester_enrollment_id = se.id
130 JOIN Course_Edition ed ON ed.id = ce.course_edition_id
131 JOIN Course c ON c.code = ed.course_code
132 LEFT JOIN Curriculum cur
133 ON cur.course_code = c.code
134 AND cur.academic_program_code = pe.academic_program_code
135 LEFT JOIN Student_Grade sg ON sg.course_enrollment_id = ce.id;
136
137
138
139
140----------
141CREATE VIEW v_course_announcements AS
142SELECT
143 ann.id AS announcement_id,
144 ann.teaches_course_edition_id AS edition_id,
145 ed.academic_year,
146 c.name AS course_name,
147 m.name || ' ' || m.surname AS sender_name,
148 m.id AS sender_id,
149 ann.message,
150 ann.sent_at,
151
152
153 r.ann1_id AS reply_to_id
154FROM Announcement ann
155 JOIN Course_Edition ed ON ed.id = ann.teaches_course_edition_id
156 JOIN Course c ON c.code = ed.course_code
157 JOIN Member m ON m.id = ann.teaches_teacher_id
158 LEFT JOIN Announcement_Replies r
159 ON r.ann2_id = ann.id
160 AND r.ann2_ttid = ann.teaches_teacher_id
161 AND r.ann2_ceid = ann.teaches_course_edition_id;
162
163
164
165
166----------
167CREATE VIEW v_exercise_grading_queue AS
168SELECT
169 ex.id AS exercise_id,
170 ex.course_edition_id AS edition_id,
171 ex.title AS exercise_title,
172 ex.deadline,
173 ex.max_grade,
174 esub.id AS submission_id,
175 esub.course_enrollment_id,
176 s.id AS student_id,
177 s.index AS student_index,
178 m.name || ' ' || m.surname AS student_name,
179 esub.submitted_at,
180 esub.graded_at,
181 esub.grade,
182 CASE
183 WHEN esub.graded_at IS NULL THEN 'pending'
184 ELSE 'graded'
185 END AS status
186FROM Exercise ex
187 JOIN Exercise_Submission esub ON esub.exercise_id = ex.id
188 JOIN Course_Enrollment ce ON ce.id = esub.course_enrollment_id
189 JOIN Semester_Enrollment se ON se.id = ce.semester_enrollment_id
190 JOIN Program_Enrollment pe ON pe.id = se.program_enrollment_id
191 JOIN Student s ON s.id = pe.student_id
192 JOIN Member m ON m.id = s.id
193ORDER BY
194 esub.graded_at NULLS FIRST,
195 esub.submitted_at;
196
197
198
199
200----------
201CREATE OR REPLACE VIEW v_course_prerequisite_chain AS
202WITH RECURSIVE prereq_tree AS (
203
204 SELECT
205 cp.successor_course_code AS course_code,
206 cp.predecessor_course_code AS prerequisite_code,
207 1 AS depth,
208 ARRAY[cp.predecessor_course_code]
209 AS path
210
211 FROM Course_Prerequisite cp
212
213 UNION ALL
214
215 SELECT
216 pt.course_code,
217 cp.predecessor_course_code,
218 pt.depth + 1,
219 pt.path || cp.predecessor_course_code
220 FROM prereq_tree pt
221 JOIN Course_Prerequisite cp
222 ON cp.successor_course_code = pt.prerequisite_code
223 WHERE cp.predecessor_course_code <> ALL(pt.path)
224
225 AND pt.depth < 20
226
227
228)
229SELECT
230 c.code AS course_code,
231 c.name AS course_name,
232 pt.prerequisite_code,
233 cpre.name AS prerequisite_name,
234 pt.depth,
235
236 pt.path AS prerequisite_path
237FROM Course c
238 LEFT JOIN prereq_tree pt
239 ON pt.course_code = c.code
240 LEFT JOIN Course cpre
241 ON cpre.code = pt.prerequisite_code;
242
243
244
245
246----------
247CREATE OR REPLACE VIEW v_student_registration_state AS
248
249WITH active_pe AS (
250 SELECT
251 pe.id AS pe_id,
252 pe.student_id,
253 pe.academic_program_code
254 FROM Program_Enrollment pe
255 WHERE pe.date_disenrollment IS NULL
256 AND pe.finished IS NOT TRUE
257),
258
259 passed_courses AS (
260 SELECT
261 pe.student_id,
262 ed.course_code AS passed_code
263 FROM active_pe pe
264 JOIN Semester_Enrollment se ON se.program_enrollment_id = pe.pe_id
265 JOIN Course_Enrollment ce ON ce.semester_enrollment_id = se.id
266 JOIN Course_Edition ed ON ed.id = ce.course_edition_id
267 JOIN Student_Grade sg ON sg.course_enrollment_id = ce.id
268 ),
269
270 passed_with_equiv AS (
271 SELECT student_id, passed_code FROM passed_courses
272 UNION
273 SELECT pc.student_id, eq.course2_code
274 FROM passed_courses pc
275 JOIN Course_Equivalence eq ON eq.course1_code = pc.passed_code
276 UNION
277 SELECT pc.student_id, eq.course1_code
278 FROM passed_courses pc
279 JOIN Course_Equivalence eq ON eq.course2_code = pc.passed_code
280 ),
281
282 current_enrollments AS (
283 SELECT
284 pe.student_id,
285 ed.course_code
286 FROM active_pe pe
287 JOIN Semester_Enrollment se
288 ON se.program_enrollment_id = pe.pe_id
289 AND se.academic_year = 2025
290 AND se.semester::int = 1
291 JOIN Course_Enrollment ce ON ce.semester_enrollment_id = se.id
292 JOIN Course_Edition ed ON ed.id = ce.course_edition_id
293 ),
294
295 current_credits AS (
296 SELECT
297 pe.student_id,
298 COALESCE(SUM(c.credits), 0) AS credits_consumed
299 FROM active_pe pe
300 LEFT JOIN Semester_Enrollment se
301 ON se.program_enrollment_id = pe.pe_id
302 AND se.academic_year = 2025
303 AND se.semester::int = 1
304 LEFT JOIN Course_Enrollment ce ON ce.semester_enrollment_id = se.id
305 LEFT JOIN Course_Edition ed ON ed.id = ce.course_edition_id
306 LEFT JOIN Course c ON c.code = ed.course_code
307 GROUP BY pe.student_id
308 ),
309
310 prereq_check AS (
311 SELECT
312 ape.student_id,
313 cp.successor_course_code AS course_code,
314 COUNT(cp.predecessor_course_code)
315 AS total_prereqs,
316 COUNT(pwe.passed_code) AS met_prereqs
317 FROM active_pe ape
318 CROSS JOIN Course_Prerequisite cp
319 LEFT JOIN passed_with_equiv pwe
320 ON pwe.student_id = ape.student_id
321 AND pwe.passed_code = cp.predecessor_course_code
322 GROUP BY ape.student_id, cp.successor_course_code
323 )
324
325SELECT
326 ape.student_id,
327 ape.academic_program_code,
328 cur.course_code,
329 c.name AS course_name,
330 c.credits,
331 cur.mandatory,
332 cur.semester::int AS curriculum_semester,
333
334
335 CASE WHEN pwe.passed_code IS NOT NULL THEN true ELSE false END
336 AS already_passed,
337
338 CASE WHEN ce_now.course_code IS NOT NULL THEN true ELSE false END
339 AS currently_enrolled,
340
341 CASE
342 WHEN pc.total_prereqs IS NULL THEN true
343
344 WHEN pc.met_prereqs = pc.total_prereqs THEN true
345 ELSE false
346 END AS prerequisites_met,
347
348 COALESCE(pc.total_prereqs - pc.met_prereqs, 0)
349 AS missing_prereq_count,
350
351 40 - COALESCE(cc.credits_consumed, 0)
352 AS credit_headroom,
353
354 CASE
355 WHEN (40 - COALESCE(cc.credits_consumed, 0)) >= c.credits
356 THEN false ELSE true
357 END AS would_exceed_cap,
358
359 CASE
360 WHEN pwe.passed_code IS NOT NULL THEN false
361
362 WHEN ce_now.course_code IS NOT NULL THEN false
363
364 WHEN pc.total_prereqs IS NOT NULL
365 AND pc.met_prereqs < pc.total_prereqs THEN false
366
367 WHEN (40 - COALESCE(cc.credits_consumed,0))
368 < c.credits THEN false
369
370 ELSE true
371 END AS can_enroll,
372
373 CASE
374 WHEN pwe.passed_code IS NOT NULL
375 THEN 'already_passed'
376 WHEN ce_now.course_code IS NOT NULL
377 THEN 'currently_enrolled'
378 WHEN pc.total_prereqs IS NOT NULL
379 AND pc.met_prereqs < pc.total_prereqs
380 THEN 'prerequisites_not_met'
381 WHEN (40 - COALESCE(cc.credits_consumed,0)) < c.credits
382 THEN 'credit_cap_exceeded'
383 ELSE 'eligible'
384 END AS enrollment_status
385
386FROM active_pe ape
387 JOIN Curriculum cur
388 ON cur.academic_program_code = ape.academic_program_code
389 JOIN Course c
390 ON c.code = cur.course_code
391 LEFT JOIN passed_with_equiv pwe
392 ON pwe.student_id = ape.student_id
393 AND pwe.passed_code = cur.course_code
394 LEFT JOIN current_enrollments ce_now
395 ON ce_now.student_id = ape.student_id
396 AND ce_now.course_code = cur.course_code
397 LEFT JOIN prereq_check pc
398 ON pc.student_id = ape.student_id
399 AND pc.course_code = cur.course_code
400 LEFT JOIN current_credits cc
401 ON cc.student_id = ape.student_id;
402
403
404
405
406----------
407CREATE OR REPLACE VIEW v_teaching_assistant_eligibility AS
408
409WITH course_passers AS (
410 SELECT DISTINCT
411 pe.student_id,
412 ed.course_code
413 FROM Program_Enrollment pe
414 JOIN Semester_Enrollment se ON se.program_enrollment_id = pe.id
415 JOIN Course_Enrollment ce ON ce.semester_enrollment_id = se.id
416 JOIN Course_Edition ed ON ed.id = ce.course_edition_id
417 JOIN Student_Grade sg ON sg.course_enrollment_id = ce.id
418),
419
420 currently_enrolled_in AS (
421 SELECT DISTINCT
422 pe.student_id,
423 ce.course_edition_id
424 FROM Program_Enrollment pe
425 JOIN Semester_Enrollment se
426 ON se.program_enrollment_id = pe.id
427 AND se.academic_year = 2025
428 AND se.semester::int = 1
429 JOIN Course_Enrollment ce ON ce.semester_enrollment_id = se.id
430 ),
431
432 existing_tas AS (
433 SELECT student_id, teacher_id FROM Teaching_Assistant
434 )
435
436SELECT
437 s.id AS student_id,
438 s.index AS student_index,
439 m.name || ' ' || m.surname AS student_name,
440 ed.id AS edition_id,
441 ed.academic_year,
442 ed.semester::int AS semester,
443 c.code AS course_code,
444 c.name AS course_name,
445
446 STRING_AGG(
447 tm.name || ' ' || tm.surname, ', '
448 ORDER BY tm.surname
449 ) AS eligible_supervisors,
450
451 COUNT(DISTINCT ce_hist.id) AS times_enrolled
452
453FROM Student s
454 JOIN Member m ON m.id = s.id
455 JOIN course_passers cp ON cp.student_id = s.id
456 JOIN Course_Edition ed
457 ON ed.course_code = cp.course_code
458 AND ed.academic_year = 2025
459 AND ed.semester::int = 1
460 JOIN Course c ON c.code = ed.course_code
461 JOIN Teaches t ON t.course_edition_id = ed.id
462 JOIN Member tm ON tm.id = t.teacher_id
463
464
465 LEFT JOIN Course_Enrollment ce_hist
466 ON ce_hist.course_edition_id IN (
467 SELECT id FROM Course_Edition WHERE course_code = c.code
468 )
469 AND ce_hist.id IN (
470 SELECT ce2.id
471 FROM Semester_Enrollment se2
472 JOIN Program_Enrollment pe2 ON pe2.id = se2.program_enrollment_id
473 JOIN Course_Enrollment ce2 ON ce2.semester_enrollment_id = se2.id
474 WHERE pe2.student_id = s.id
475 )
476WHERE NOT EXISTS (
477 SELECT 1 FROM currently_enrolled_in cei
478 WHERE cei.student_id = s.id
479 AND cei.course_edition_id = ed.id
480)
481 AND NOT EXISTS (
482 SELECT 1 FROM existing_tas eta
483 JOIN Teaches tt ON tt.teacher_id = eta.teacher_id
484 WHERE eta.student_id = s.id
485 AND tt.course_edition_id = ed.id
486)
487GROUP BY
488 s.id, s.index, m.name, m.surname,
489 ed.id, ed.academic_year, ed.semester,
490 c.code, c.name;
491
492
493
494
495
496
497
498
499