DatabaseCreation: views_najdi_mentor.sql

File views_najdi_mentor.sql, 13.1 KB (added by 231067, 9 days ago)
Line 
1-- VIEW 1
2CREATE OR REPLACE VIEW vw_student_advanced_portfolio AS
3WITH StudentStats AS (
4 SELECT
5 m.StudentID,
6 COUNT(DISTINCT m.ID) AS Total_Mentorships,
7 COUNT(DISTINCT CASE WHEN t.Status = 1 THEN t.ID END) AS Total_Completed_Tasks,
8 COUNT(DISTINCT CASE WHEN t.Status != 1 AND t.EndDate < CURRENT_DATE THEN t.ID END) AS Total_Overdue_Tasks
9 FROM Mentorship m
10 LEFT JOIN Task t ON m.ID = t.MentorshipID
11 GROUP BY m.StudentID
12),
13SubjectStats AS (
14 SELECT us.UserID, COUNT(DISTINCT us.SubjectID) AS Enrolled_Subjects_Count
15 FROM User_Subject us
16 GROUP BY us.UserID
17)
18SELECT
19 u.ID AS StudentID,
20 u.Name::text || ' ' || u.Surname::text AS Student_FullName,
21 f.Name AS Faculty_Name,
22 COALESCE(ss.Enrolled_Subjects_Count, 0) AS Enrolled_Subjects_Count,
23 COALESCE(st.Total_Mentorships, 0) AS Total_Mentorships,
24 COALESCE(st.Total_Completed_Tasks, 0) AS Total_Completed_Tasks,
25 COALESCE(st.Total_Overdue_Tasks, 0) AS Total_Overdue_Tasks
26FROM "User" u
27JOIN Faculty f ON u.FacultyID = f.ID
28JOIN StudentStats st ON u.ID = st.StudentID
29LEFT JOIN SubjectStats ss ON u.ID = ss.UserID;
30
31
32-- VIEW 2
33CREATE OR REPLACE VIEW vw_mentor_conversion_and_success_matrix AS
34WITH MentorTaskStats AS (
35 SELECT
36 m.MentorID,
37 COUNT(DISTINCT m.ID) AS Total_Mentorships,
38 COUNT(t.ID) AS Total_Tasks_Assigned,
39 SUM(CASE WHEN t.Status = 1 THEN 1 ELSE 0 END) AS Successful_Mentorships
40 FROM Mentorship m
41 LEFT JOIN Task t ON m.ID = t.MentorshipID
42 GROUP BY m.MentorID
43),
44MentorTopicStats AS (
45 SELECT
46 ts.MentorID,
47 COUNT(ts.ID) AS Total_Proposed_Topics,
48 COUNT(CASE WHEN ts.isAvailable = false THEN 1 END) AS Accepted_Topics
49 FROM TopicSuggestion ts
50 GROUP BY ts.MentorID
51)
52SELECT
53 mks.MentorID,
54 u.Name::text || ' ' || u.Surname::text AS Mentor_Name,
55 COALESCE(mts.Total_Proposed_Topics, 0) AS Total_Proposed_Topics,
56 COALESCE(mts.Accepted_Topics, 0) AS Accepted_Topics,
57 -- Фалбак 1 при пресметка
58 ROUND((COALESCE(mts.Accepted_Topics, 0)::numeric / COALESCE(NULLIF(mts.Total_Proposed_Topics, 0), 1)) * 100, 2) AS Topics_Acceptance_Percentage,
59 COALESCE(mks.Total_Mentorships, 0) AS Total_Mentorships,
60 COALESCE(mks.Total_Tasks_Assigned, 0) AS Total_Tasks_Assigned,
61 COALESCE(mks.Successful_Mentorships, 0) AS Successful_Mentorships,
62 RANK() OVER(
63 ORDER BY
64 COALESCE(mks.Total_Mentorships, 0) DESC,
65 -- Фалбак 1 при рангирање
66 ROUND((COALESCE(mts.Accepted_Topics, 0)::numeric / COALESCE(NULLIF(mts.Total_Proposed_Topics, 0), 1)) * 100, 2) DESC NULLS LAST
67 ) AS Mentor_Rank_Position
68FROM MentorTaskStats mks
69JOIN "User" u ON mks.MentorID = u.ID
70LEFT JOIN MentorTopicStats mts ON mks.MentorID = mts.MentorID;
71
72
73-- VIEW 3
74CREATE OR REPLACE VIEW vw_student_progress_and_critical_alerts AS
75WITH TaskAggregations AS (
76 SELECT
77 t.MentorshipID,
78 COUNT(t.ID) AS Total_Tasks,
79 COUNT(CASE WHEN t.Status = 1 THEN t.ID END) AS Completed_Tasks,
80 COUNT(CASE WHEN t.EndDate < CURRENT_DATE AND t.Status != 1 THEN t.ID END) AS Critical_Overdue_Tasks_Count,
81 STRING_AGG(
82 CASE WHEN t.EndDate < CURRENT_DATE AND t.Status != 1 THEN
83 t.Description::text || ' (' ||
84 CASE
85 WHEN t.Status = 0 THEN 'Активна'
86 WHEN t.Status = 2 THEN 'Прегледана'
87 WHEN t.Status = 3 THEN 'Одбиена'
88 ELSE 'Непознат Статус'
89 END || ')'
90 ELSE NULL END, ' | '
91 ) AS Overdue_Tasks_List
92 FROM Task t
93 GROUP BY t.MentorshipID
94)
95SELECT
96 m.ID AS MentorshipID,
97 stu.Name::text || ' ' || stu.Surname::text AS Student_Name,
98 men.Name::text || ' ' || men.Surname::text AS Mentor_Name,
99 ts.Name AS Topic_Name,
100 COALESCE(ta.Total_Tasks, 0) AS Total_Tasks,
101 COALESCE(ta.Completed_Tasks, 0) AS Completed_Tasks,
102 -- Фалбак 1 при делење
103 ROUND((COALESCE(ta.Completed_Tasks, 0)::numeric / COALESCE(NULLIF(ta.Total_Tasks, 0), 1)) * 100, 2) AS Progress_Percentage,
104 COALESCE(ta.Critical_Overdue_Tasks_Count, 0) AS Critical_Overdue_Tasks_Count,
105 COALESCE(ta.Overdue_Tasks_List, 'Нема задоцнети задачи') AS Overdue_Tasks_List
106FROM Mentorship m
107JOIN "User" stu ON m.StudentID = stu.ID
108JOIN "User" men ON m.MentorID = men.ID
109JOIN TopicSuggestion ts ON m.TopicSuggestionID = ts.ID
110LEFT JOIN TaskAggregations ta ON m.ID = ta.MentorshipID;
111
112
113-- VIEW 4
114CREATE OR REPLACE VIEW vw_university_academic_hierarchy AS
115WITH SubjectStats AS (
116 SELECT
117 ts.SubjectID,
118 COUNT(DISTINCT us.UserID) AS Enrolled_Students_In_Subject,
119 COUNT(DISTINCT ts.ID) AS Total_Topics_Suggested,
120 COUNT(DISTINCT m.ID) AS Active_Mentorships_Generated
121 FROM TopicSuggestion ts
122 LEFT JOIN User_Subject us ON ts.SubjectID = us.SubjectID
123 LEFT JOIN Mentorship m ON ts.ID = m.TopicSuggestionID
124 GROUP BY ts.SubjectID
125)
126SELECT
127 un.Name AS University_Name,
128 f.Name AS Faculty_Name,
129 sp.Name AS StudyProgram_Name,
130 sub.Name AS Subject_Name,
131 COALESCE(ss.Enrolled_Students_In_Subject, 0) AS Enrolled_Students_In_Subject,
132 COALESCE(ss.Total_Topics_Suggested, 0) AS Total_Topics_Suggested,
133 COALESCE(ss.Active_Mentorships_Generated, 0) AS Active_Mentorships_Generated
134FROM University un
135JOIN Faculty f ON un.ID = f.UniversityID
136JOIN StudyProgram sp ON f.ID = sp.FacultyID
137JOIN Subject_StudyProgram ssp ON sp.ID = ssp.StudyProgramID
138JOIN Subject sub ON ssp.SubjectID = sub.ID
139LEFT JOIN SubjectStats ss ON sub.ID = ss.SubjectID;
140
141
142-- VIEW 5
143CREATE OR REPLACE VIEW vw_system_mentorship_integrity_audit AS
144WITH TaskCount AS (
145 SELECT t.MentorshipID, COUNT(t.ID) AS Total_Tasks_Generated
146 FROM Task t GROUP BY t.MentorshipID
147)
148SELECT
149 m.ID AS MentorshipID,
150 COALESCE(stu.Name::text || ' ' || stu.Surname::text, 'ИЗБРИШAН СТУДЕНТ') AS Student_Details,
151 CASE WHEN stu.ID IS NOT NULL THEN 'Valid' ELSE 'Missing' END AS Student_Exists,
152 COALESCE(men.Name::text || ' ' || men.Surname::text, 'ИЗБРИШAН МЕНТОР') AS Mentor_Details,
153 CASE WHEN men.ID IS NOT NULL THEN 'Valid' ELSE 'Missing' END AS Mentor_Exists,
154 COALESCE(ts.Name, 'Нема доделено tema') AS Topic_Name,
155 COALESCE(sub.Name, 'Непознат Предмет') AS Subject_Name,
156 COALESCE(tc.Total_Tasks_Generated, 0) AS Total_Tasks_Generated,
157 CASE
158 WHEN stu.ID IS NULL AND men.ID IS NULL THEN 'CRITICAL: Целосно изолиран запис (Ghost Record)'
159 WHEN stu.ID IS NULL THEN 'ERROR: Недостасува студент'
160 WHEN men.ID IS NULL THEN 'ERROR: Недостасува ментор'
161 WHEN COALESCE(tc.Total_Tasks_Generated, 0) = 0 THEN 'WARNING: Валидни корисници, но неактивно менторство (0 задачи)'
162 ELSE 'HEALTHY: Системот е стабилен'
163 END AS System_Health_Status
164FROM Mentorship m
165LEFT JOIN "User" stu ON m.StudentID = stu.ID
166LEFT JOIN "User" men ON m.MentorID = men.ID
167LEFT JOIN TopicSuggestion ts ON m.TopicSuggestionID = ts.ID
168LEFT JOIN Subject sub ON ts.SubjectID = sub.ID
169LEFT JOIN TaskCount tc ON m.ID = tc.MentorshipID;
170
171
172-- 6
173--CREATE OR REPLACE VIEW vw_mentorship_typology_analytics AS
174--WITH MentorshipTaskCounts AS (
175-- SELECT m.MentorshipTypeID, COUNT(t.ID) AS Total_Tasks_Generated
176-- FROM Mentorship m
177-- JOIN Task t ON m.ID = t.MentorshipID
178-- GROUP BY m.MentorshipTypeID
179--)
180--SELECT
181-- mtp.Type AS Mentorship_Type,
182-- ma.Name AS Defining_Attribute,
183-- COUNT(DISTINCT m.ID) AS Total_Active_Mentorships,
184-- COUNT(DISTINCT m.StudentID) AS Unique_Students_Involved,
185-- COUNT(DISTINCT m.MentorID) AS Unique_Mentors_Engaged,
186-- COALESCE(mtc.Total_Tasks_Generated, 0) AS Total_Tasks_Generated
187--FROM MentorshipType mtp
188--JOIN MentorshipAttribute ma ON mtp.MentorshipAttributeID = ma.ID
189--LEFT JOIN Mentorship m ON mtp.ID = m.MentorshipTypeID
190--LEFT JOIN MentorshipTaskCounts mtc ON mtp.ID = mtc.MentorshipTypeID
191--GROUP BY mtp.ID, mtp.Type, ma.Name, mtc.Total_Tasks_Generated;
192
193
194-- VIEW 6
195CREATE OR REPLACE VIEW vw_chat_analytics AS
196SELECT
197 c.ID AS chat_id,
198
199 c.Title,
200
201 st.Name || ' ' || st.Surname
202 AS student_name,
203
204 mt.Name || ' ' || mt.Surname
205 AS mentor_name,
206
207 lm.Content AS last_message,
208
209 lm.Timestamp AS last_message_time,
210
211 unread.unread_count,
212
213 total.total_messages
214
215FROM Chat c
216
217JOIN "User" st
218 ON c.StudentID = st.ID
219
220JOIN "User" mt
221 ON c.MentorID = mt.ID
222
223LEFT JOIN LATERAL (
224
225 SELECT
226 m.Content,
227 m.Timestamp
228
229 FROM Message m
230
231 WHERE m.ChatID = c.ID
232
233 ORDER BY m.Timestamp DESC
234
235 LIMIT 1
236
237) lm ON true
238
239LEFT JOIN (
240
241 SELECT
242 ChatID,
243 COUNT(*) AS unread_count
244
245 FROM Message
246
247 WHERE isRead = false
248
249 GROUP BY ChatID
250
251) unread
252
253ON unread.ChatID = c.ID
254
255LEFT JOIN (
256
257 SELECT
258 ChatID,
259 COUNT(*) AS total_messages
260
261 FROM Message
262
263 GROUP BY ChatID
264
265) total
266
267ON total.ChatID = c.ID;
268
269
270
271-- VIEW 7
272CREATE OR REPLACE VIEW vw_mentor_workload_summary AS
273WITH PendingTasks AS (
274 SELECT m.MentorID, COUNT(t.ID) AS Pending_Tasks
275 FROM Mentorship m
276 JOIN Task t ON m.ID = t.MentorshipID
277 WHERE t.Status = 0
278 GROUP BY m.MentorID
279)
280SELECT
281 m.ID AS MentorID,
282 m.Name::text || ' ' || m.Surname::text AS Mentor_Name,
283 (SELECT COUNT(*) FROM Mentorship m2 WHERE m2.MentorID = m.ID) AS Total_Mentorships,
284 COALESCE(pt.Pending_Tasks, 0) AS Pending_Tasks
285FROM "User" m
286LEFT JOIN PendingTasks pt ON m.ID = pt.MentorID
287GROUP BY m.ID, m.Name, m.Surname, pt.Pending_Tasks;
288
289
290-- VIEW 8
291CREATE OR REPLACE VIEW vw_subject_topic_conversion AS
292WITH TopicCounts AS (
293 SELECT
294 ts.SubjectID,
295 COUNT(ts.ID) AS Total_Suggestions,
296 COUNT(CASE WHEN ts.isAvailable = false THEN ts.ID END) AS Accepted_Topics
297 FROM TopicSuggestion ts
298 GROUP BY ts.SubjectID
299)
300SELECT
301 s.Name AS Subject_Name,
302 COALESCE(tc.Total_Suggestions, 0) AS Total_Suggestions,
303 COALESCE(tc.Accepted_Topics, 0) AS Accepted_Topics,
304 ROUND((COALESCE(tc.Accepted_Topics, 0)::numeric / COALESCE(NULLIF(tc.Total_Suggestions, 0), 1)) * 100, 2) AS Conversion_Percentage
305FROM Subject s
306LEFT JOIN TopicCounts tc ON s.ID = tc.SubjectID;
307
308
309-- VIEW 9
310CREATE OR REPLACE VIEW vw_university_faculty_basic_stats AS
311WITH ProgramCounts AS (
312 SELECT sp.FacultyID, COUNT(DISTINCT sp.ID) AS Total_Study_Programs
313 FROM StudyProgram sp
314 GROUP BY sp.FacultyID
315)
316SELECT
317 un.Name AS University_Name,
318 f.Name AS Faculty_Name,
319 COALESCE(pc.Total_Study_Programs, 0) AS Total_Study_Programs
320FROM Faculty f
321JOIN University un ON f.UniversityID = un.ID
322LEFT JOIN ProgramCounts pc ON f.ID = pc.FacultyID;
323
324
325
326
327-- VIEW 10
328
329CREATE OR REPLACE VIEW vw_notification_center AS
330SELECT
331 n.ID,
332 n.Content,
333 n.Timestamp,
334 n.isRead,
335
336 u.Name || ' ' || u.Surname
337 AS notified_user,
338
339 nt.Type,
340
341 msg.Content AS message_content,
342
343 co.Comment AS opinion_comment
344
345FROM Notification n
346
347JOIN "User" u
348 ON n.UserToNotifyID = u.ID
349
350LEFT JOIN Notification_Type nt
351 ON n.ID = nt.NotificationID
352
353LEFT JOIN Message msg
354 ON n.MessageID = msg.ID
355
356LEFT JOIN CommentOpinion co
357 ON n.CommentOpinionID = co.ID;
358
359
360
361-- TESTING VIEWS
362SELECT * FROM vw_student_advanced_portfolio LIMIT 100;
363SELECT * FROM vw_mentor_conversion_and_success_matrix LIMIT 10;
364SELECT * FROM vw_student_progress_and_critical_alerts LIMIT 10;
365SELECT * FROM vw_university_academic_hierarchy LIMIT 10;
366SELECT * FROM vw_system_mentorship_integrity_audit LIMIT 10;
367--SELECT * FROM vw_mentorship_typology_analytics LIMIT 10;
368SELECT * FROM vw_chat_analytics LIMIT 10;
369SELECT * FROM vw_mentor_workload_summary LIMIT 10;
370SELECT * FROM vw_subject_topic_conversion LIMIT 10;
371SELECT * FROM vw_university_faculty_basic_stats LIMIT 10;
372SELECT * FROM vw_notification_center LIMIT 50;
373
374-- VIEW 2: Ќе ги подреди по ранг на успешни теми
375SELECT * FROM vw_mentor_conversion_and_success_matrix LIMIT 50;
376
377-- VIEW 3: Ќе ги извади само оние што имаат КРИТИЧНИ доцнења
378SELECT * FROM vw_student_progress_and_critical_alerts ORDER BY critical_overdue_tasks_count DESC LIMIT 10;
379
380-- VIEW 5: Ќе ги извади прво оние каде што СИСТЕМОТ Е СТАБИЛЕН или има ГРЕШКА
381SELECT * FROM vw_system_mentorship_integrity_audit ORDER BY system_health_status DESC LIMIT 10;
382
383
384-- ANALYSIS
385-- 1
386EXPLAIN ANALYZE
387SELECT * FROM vw_student_advanced_portfolio WHERE studentid = 5446279;
388-- 2
389EXPLAIN ANALYZE
390SELECT * FROM vw_mentor_conversion_and_success_matrix WHERE mentorid = 2082114;
391
392-- 3
393EXPLAIN ANALYZE
394SELECT * FROM vw_student_progress_and_critical_alerts WHERE mentorshipid = 1;
395
396-- 4
397EXPLAIN ANALYZE
398SELECT * FROM vw_university_academic_hierarchy WHERE subject_name = 'Математика 1';
399
400
401
402
403
404
405
406