Напредни извештаи од базата (SQL и складирани процедури)
1. Листање(приказ) на денешни events, count на денешни часови, испити и tasks:
WITH EventResult AS (
SELECT
NULL::INTEGER AS task_id,
ce.calendar_event_id,
ce.event_name,
ce.event_type,
ce.event_start_time,
ce.event_end_time,
nre.event_date
FROM
calendar_event AS ce
JOIN
non_repeating_event AS nre ON ce.calendar_event_id = nre.calendar_event_id
LEFT JOIN
student_event AS se ON se.calendar_event_id = ce.calendar_event_id
LEFT JOIN
subject_event AS sje ON sje.calendar_event_id = ce.calendar_event_id
WHERE
nre.event_date = CURRENT_DATE
AND (se.student_id = 91324 OR sje.calendar_event_id = 91324)
UNION
SELECT
NULL::INTEGER AS task_id,
ce.calendar_event_id,
ce.event_name,
ce.event_type,
ce.event_start_time,
ce.event_end_time,
CASE
WHEN re.event_week_day = 'MONDAY' THEN date_trunc('week', CURRENT_DATE)::DATE
WHEN re.event_week_day = 'TUESDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '1 day')::DATE
WHEN re.event_week_day = 'WEDNESDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '2 days')::DATE
WHEN re.event_week_day = 'THURSDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '3 days')::DATE
WHEN re.event_week_day = 'FRIDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '4 days')::DATE
WHEN re.event_week_day = 'SATURDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '5 days')::DATE
WHEN re.event_week_day = 'SUNDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '6 days')::DATE
END AS event_date
FROM
calendar_event AS ce
JOIN
repeating_event AS re ON ce.calendar_event_id = re.calendar_event_id
LEFT JOIN
student_event AS se ON se.calendar_event_id = ce.calendar_event_id
LEFT JOIN
subject_event AS sje ON sje.calendar_event_id = ce.calendar_event_id
WHERE
re.starting_date <= (
CASE
WHEN re.event_week_day = 'MONDAY' THEN date_trunc('week', CURRENT_DATE)::DATE
WHEN re.event_week_day = 'TUESDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '1 day')::DATE
WHEN re.event_week_day = 'WEDNESDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '2 days')::DATE
WHEN re.event_week_day = 'THURSDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '3 days')::DATE
WHEN re.event_week_day = 'FRIDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '4 days')::DATE
WHEN re.event_week_day = 'SATURDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '5 days')::DATE
WHEN re.event_week_day = 'SUNDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '6 days')::DATE
END
)
AND re.ending_date >= (
CASE
WHEN re.event_week_day = 'MONDAY' THEN date_trunc('week', CURRENT_DATE)::DATE
WHEN re.event_week_day = 'TUESDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '1 day')::DATE
WHEN re.event_week_day = 'WEDNESDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '2 days')::DATE
WHEN re.event_week_day = 'THURSDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '3 days')::DATE
WHEN re.event_week_day = 'FRIDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '4 days')::DATE
WHEN re.event_week_day = 'SATURDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '5 days')::DATE
WHEN re.event_week_day = 'SUNDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '6 days')::DATE
END
)
AND (EXTRACT(day FROM date_trunc('week', CURRENT_DATE) - date_trunc('week', (
CASE
WHEN re.event_week_day = 'MONDAY' THEN date_trunc('week', CURRENT_DATE)::DATE
WHEN re.event_week_day = 'TUESDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '1 day')::DATE
WHEN re.event_week_day = 'WEDNESDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '2 days')::DATE
WHEN re.event_week_day = 'THURSDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '3 days')::DATE
WHEN re.event_week_day = 'FRIDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '4 days')::DATE
WHEN re.event_week_day = 'SATURDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '5 days')::DATE
WHEN re.event_week_day = 'SUNDAY' THEN (date_trunc('week', CURRENT_DATE) + INTERVAL '6 days')::DATE
END
))) % (7 * re.repeats_every_n_weeks)) = 0
AND (se.student_id = 91324 OR sje.student_id = 91324)
UNION
SELECT
t.task_id,
NULL AS calendar_event_id,
NULL AS event_name,
NULL AS event_type,
NULL AS event_start_time,
NULL AS event_end_time,
NULL AS event_date
FROM task t
JOIN student_task st ON t.task_id = st.task_id
LEFT JOIN creates_task ct ON t.task_id = ct.task_id
WHERE (st.student_id = 91324 OR ct.task_id = 91324) AND task_due_date = CURRENT_DATE
)
SELECT
COUNT(CASE WHEN event_type = 'Exam' THEN 1 END) AS exam_count,
COUNT(CASE WHEN event_type <> 'Exam' THEN 1 END) AS non_exam_count,
COUNT(DISTINCT task_id) AS distinct_task_count
FROM EventResult;
2. Листање(приказ) на таскови за наредните три дена:
SELECT
t.task_name,
t.task_description,
t.task_due_date,
t.task_priority
FROM
task AS t
JOIN
student_task AS st ON t.task_id = st.task_id
LEFT JOIN
creates_task AS ct ON t.task_id = ct.task_id
LEFT JOIN
subject_at_term AS sat ON ct.term_subject_id = sat.term_subject_id
AND ct.term_type = sat.term_type
AND ct.starting_year = sat.starting_year
AND ct.finishing_year = sat.finishing_year
AND ct.student_id = sat.student_id
WHERE
(st.student_id = 91324 OR ct.student_id = 91324)
AND t.task_due_date BETWEEN CURRENT_DATE AND CURRENT_DATE + INTERVAL '3 days'
ORDER BY
t.task_priority;
3. Листање(приказ) на испити за наредните седум дена:
SELECT
ce.event_name,
sat.subject_name,
ce.event_type,
ce.event_start_time,
ce.event_end_time,
nre.event_date
FROM
subject_event AS se
JOIN
calendar_event AS ce ON se.calendar_event_id = ce.calendar_event_id
JOIN
subject_at_term AS sat ON se.term_subject_id = sat.term_subject_id
AND se.term_type = sat.term_type
AND se.starting_year = sat.starting_year
AND se.finishing_year = sat.finishing_year
AND se.student_id = sat.student_id
JOIN
non_repeating_event AS nre ON ce.calendar_event_id = nre.calendar_event_id
WHERE
ce.event_type = 'Exam'
AND se.student_id = 91324
AND nre.event_date >= CURRENT_DATE
AND nre.event_date <= CURRENT_DATE + INTERVAL '7 days'
ORDER BY
nre.event_date,
ce.event_start_time;
4. Листање(приказ) на сите евенти за одредена недела:
WITH Result AS (
SELECT
ce.calendar_event_id,
ce.event_name,
ce.event_type,
ce.event_start_time,
ce.event_end_time,
nre.event_date
FROM
calendar_event AS ce
JOIN
non_repeating_event AS nre ON ce.calendar_event_id = nre.calendar_event_id
LEFT JOIN
student_event AS se ON se.calendar_event_id = ce.calendar_event_id
LEFT JOIN
subject_event AS sje ON sje.calendar_event_id = ce.calendar_event_id
WHERE
nre.event_date >= date_trunc('week', CURRENT_DATE)
AND nre.event_date < date_trunc('week', CURRENT_DATE) + INTERVAL '1 week'
AND (se.student_id = 91324 OR sje.student_id = 91324)
UNION
SELECT
ce.calendar_event_id,
ce.event_name,
ce.event_type,
ce.event_start_time,
ce.event_end_time,
CASE
WHEN re.event_week_day = 'MONDAY' THEN date_trunc('week', CURRENT_DATE)::DATE
WHEN re.event_week_day = 'TUESDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '1 day'
WHEN re.event_week_day = 'WEDNESDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '2 days'
WHEN re.event_week_day = 'THURSDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '3 days'
WHEN re.event_week_day = 'FRIDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '4 days'
WHEN re.event_week_day = 'SATURDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '5 days'
WHEN re.event_week_day = 'SUNDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '6 days'
END AS event_date
FROM
calendar_event AS ce
JOIN
repeating_event AS re ON ce.calendar_event_id = re.calendar_event_id
LEFT JOIN
student_event AS se ON se.calendar_event_id = ce.calendar_event_id
LEFT JOIN
subject_event AS sje ON sje.calendar_event_id = ce.calendar_event_id
WHERE
re.starting_date <= (
CASE
WHEN re.event_week_day = 'MONDAY' THEN date_trunc('week', CURRENT_DATE)::DATE
WHEN re.event_week_day = 'TUESDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '1 day'
WHEN re.event_week_day = 'WEDNESDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '2 days'
WHEN re.event_week_day = 'THURSDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '3 days'
WHEN re.event_week_day = 'FRIDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '4 days'
WHEN re.event_week_day = 'SATURDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '5 days'
WHEN re.event_week_day = 'SUNDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '6 days'
END
)
AND re.ending_date >= (
CASE
WHEN re.event_week_day = 'MONDAY' THEN date_trunc('week', CURRENT_DATE)::DATE
WHEN re.event_week_day = 'TUESDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '1 day'
WHEN re.event_week_day = 'WEDNESDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '2 days'
WHEN re.event_week_day = 'THURSDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '3 days'
WHEN re.event_week_day = 'FRIDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '4 days'
WHEN re.event_week_day = 'SATURDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '5 days'
WHEN re.event_week_day = 'SUNDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '6 days'
END
)
AND (EXTRACT(day FROM date_trunc('week', CURRENT_DATE) - date_trunc('week', (
CASE
WHEN re.event_week_day = 'MONDAY' THEN date_trunc('week', CURRENT_DATE)::DATE
WHEN re.event_week_day = 'TUESDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '1 day'
WHEN re.event_week_day = 'WEDNESDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '2 days'
WHEN re.event_week_day = 'THURSDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '3 days'
WHEN re.event_week_day = 'FRIDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '4 days'
WHEN re.event_week_day = 'SATURDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '5 days'
WHEN re.event_week_day = 'SUNDAY' THEN date_trunc('week', CURRENT_DATE)::DATE + INTERVAL '6 days'
END
))) % (7 * re.repeats_every_n_weeks)) = 0
AND (se.student_id = 91324 OR sje.student_id = 91324)
)
SELECT
calendar_event_id,
event_name,
event_type,
event_start_time,
event_end_time,
event_date::DATE
FROM Result
ORDER BY
event_date, -- Order by day of the week
event_start_time; -- Order by time
5. Листање(приказ) на сите евенти за одреден семестар:
SELECT
ce.event_name,
sat.subject_name,
ce.event_type,
ce.event_description
FROM
subject_at_term AS sat
JOIN
subject_event AS se
ON sat.student_id = se.student_id
AND sat.term_subject_id = se.term_subject_id
AND sat.term_type = se.term_type
AND sat.starting_year = se.starting_year
AND sat.finishing_year = se.finishing_year
JOIN
calendar_event AS ce
ON se.calendar_event_id = ce.calendar_event_id
WHERE
se.student_id = 91324
AND se.starting_year = '2023'
AND se.finishing_year = '2024'
AND se.term_type = 'Zimski';
6. Листање(приказ) на сите евенти и task-ови за зададен предмет:
SELECT
ce.calendar_event_id,
ce.event_name,
ce.event_type,
ce.event_description,
ce.event_start_time,
ce.event_end_time,
NULL AS task_id,
NULL AS task_name,
NULL AS task_description,
NULL AS task_priority,
NULL AS is_done
FROM
subject_event se
JOIN
calendar_event ce ON se.calendar_event_id = ce.calendar_event_id
WHERE
se.term_subject_id = 56
AND se.term_type = 'Zimski'
AND se.starting_year = 2023
AND se.finishing_year = 2024
AND se.student_id = 91324
UNION
SELECT
NULL AS calendar_event_id,
NULL AS event_name,
NULL AS event_type,
NULL AS event_description,
NULL AS event_start_time,
NULL AS event_end_time,
t.task_id,
t.task_name,
t.task_description,
t.task_priority,
t.is_done
FROM
creates_task ct
JOIN
task AS t ON ct.task_id = t.task_id
WHERE
ct.term_subject_id = 56
AND ct.term_type = 'Zimski'
AND ct.starting_year = 2023
AND ct.finishing_year = 2024
AND ct.student_id = 91324;
7. Листање(приказ) на сите на сите книги и автори по одреден предмет (пример:Бази на податоци):
WITH SubjectBooks AS (
SELECT
rb.book_id,
sbb.book_title,
sbb.book_edition,
ba.author_id,
a.author_name
FROM
recommended_book AS rb
JOIN
subject_at_term AS sat ON
rb.term_subject_id = sat.term_subject_id
AND rb.term_type = sat.term_type
AND rb.starting_year = sat.starting_year
AND rb.finishing_year = sat.finishing_year
AND rb.student_id = sat.student_id
JOIN
subject_book AS sbb ON rb.book_id = sbb.book_id
JOIN
book_author AS ba ON rb.book_id = ba.book_id
JOIN
author AS a ON ba.author_id = a.author_id
WHERE
sat.subject_name = 'Bazi na podatoci'
AND rb.student_id = 91324
)
SELECT
sb.book_id,
sb.book_title,
sb.book_edition,
sb.author_id,
sb.author_name
FROM
SubjectBooks AS sb;
8. Приказна на сите feedbacks (описи и наслови на feedback) со оценка помала од 3:
SELECT
fb.fb_id,
fb.fb_date,
fb.fb_title,
fb.fb_description,
fb.fb_rating
FROM
feedback AS fb
WHERE
fb.fb_rating < 3
AND EXISTS (
SELECT 1
FROM
gives_feedback AS gf
WHERE
gf.fb_id = fb.fb_id
AND gf.student_id = 91324
);
9:Просечен број на креирани настани во тековната година по студент
WITH counted_events AS (
select
s.student_id,
COUNT(distinct(se.calendar_event_id)) AS student_events,
COUNT(distinct(sje.calendar_event_id)) as subject_events
FROM
student s
LEFT join
student_event se ON s.student_id = se.student_id
left join
subject_at_term sat on sat.student_id = s.student_id
LEFT JOIN
subject_event sje ON sat.student_id = sje.student_id
LEFT JOIN
calendar_event ce ON se.calendar_event_id = ce.calendar_event_id or sje.calendar_event_id = ce.calendar_event_id
LEFT JOIN
repeating_event re ON ce.calendar_event_id = re.calendar_event_id
AND EXTRACT(YEAR FROM CURRENT_DATE) >= EXTRACT(YEAR FROM re.starting_date)
AND EXTRACT(YEAR FROM CURRENT_DATE) <= EXTRACT(YEAR FROM re.ending_date)
LEFT JOIN
non_repeating_event nre ON ce.calendar_event_id = nre.calendar_event_id
AND EXTRACT(YEAR FROM nre.event_date) = EXTRACT(YEAR FROM CURRENT_DATE)
GROUP BY
s.student_id
)
SELECT
AVG(student_events) AS average_student_events,
AVG(subject_events) AS average_subject_events
FROM
counted_events
10: Просечен рејтинг во тековната година по студент
WITH student_ratings AS (
SELECT
s.student_id,
AVG(fb.fb_rating) AS student_rating
FROM
student s
JOIN
gives_feedback gf ON gf.student_id = s.student_id
JOIN
feedback fb ON gf.fb_id = fb.fb_id
AND EXTRACT(YEAR FROM fb.fb_date) = EXTRACT(YEAR FROM CURRENT_DATE)
GROUP BY
s.student_id
)
SELECT
AVG(student_rating) AS average_student_rating
FROM
student_ratings;
Last modified
21 months ago
Last modified on 02/05/24 17:19:56
Note:
See TracWiki
for help on using the wiki.
