| Version 9 (modified by , 3 weeks ago) ( diff ) |
|---|
Вкупна годишна анализа од пациенти - расположение, успешност на консултации и терапија
SELECT
EXTRACT(YEAR FROM d.date) AS Year,
COUNT(DISTINCT p.id_user) AS Total_Patients,
COUNT(DISTINCT c.id_consultation) AS Total_Consultations,
COUNT(DISTINCT th.id_therapy) AS Total_Therapies,
ROUND(AVG(d.daily_rating), 2) AS Avg_Mood_All_Patients,
MIN(d.daily_rating) AS Lowest_Mood_Recorded
FROM project.patient p
JOIN project.user u
ON u.id_user = p.id_user
LEFT JOIN project.consultation c
ON c.id_patient = p.id_user
LEFT JOIN project.therapy th
ON th.id_consultation = c.id_consultation
JOIN project.diary d
ON d.id_patient = p.id_user
GROUP BY EXTRACT(YEAR FROM d.date)
ORDER BY Year;
Релациона алгебра
- P(id_user)
- U(id_user, ...)
- C(id_consultation, id_patient)
- TH(id_therapy, id_consultation)
- D(id_patient, date, daily_rating)
JOIN на сите табели:
J1 ← P ⨝{P.id_user = U.id_user} U
Ј2 ← Ј1 ⟕{P.id_user = C.id_patient} C
Ј3 ← Ј2 ⟕{C.id_consultation = TH.id_consultation} TH
Ј4 ← Ј3 ⨝{P.id_user = D.id_patient} D
Проекција со трансформација на датум
D' ← π{id_user, id_consultation, id_therapy, daily_rating, YEAR(date) -> Year}(J4)
Групирање и пресметка на агрегати
G ← Year σ COUNT(DISTINCT id_user) -> Total_Patients, COUNT(DISTINCT id_consultation) -> Total_Consultations, COUNT(DISTINCT id_therapy) -> Total_Therapies, AVG(daily_rating) -> Avg_Mood_All_Patients, MIN(daily_rating) -> Lowest_Mood_Recorded }(D')
Хронолошко подредување според година
R{final} ← τ{Year}(G)
Годишен извештај за честота на користење на консултации и процент на платени консултации заедно со нивната просечна цена
SELECT
EXTRACT(YEAR FROM c.date) AS Year,
t.id_user,
u.name || ' ' || u.surname AS Therapist_Name,
COUNT(c.id_consultation) AS Total_Consultations,
COUNT(CASE WHEN date_of_payment IS NOT NULL THEN 1 END) AS Completed_Consultations,
ROUND(
COUNT(CASE WHEN date_of_payment IS NOT NULL THEN 1 END)::DECIMAL
/ NULLIF(COUNT(c.id_consultation), 0) * 100,
2
) AS Completion_Rate_Percentage,
ROUND(AVG(c.price), 2) AS Avg_Consultation_Price
FROM project.therapist t
JOIN project.user u
ON u.id_user = t.id_user
JOIN project.consultation c
ON c.id_therapist = t.id_user
GROUP BY
EXTRACT(YEAR FROM c.date),
t.id_user,
u.name,
u.surname
ORDER BY
Year,
Completion_Rate_Percentage DESC;
Релациона алгебра
- T(id_user)
- U(id_user, name, surname)
- C(id_consultation, id_therapist, date, price, date_of_payment)
JOIN на сите табели:
J1 ← T ⨝{T.id_user = U.id_user} U
Ј2 ← Ј1 ⨝{T.id_user = C.id_therapist} C
Екстракција на име и година
F1 ← π{id_user, id_consultation, price, date_of_payment, YEAR(date) -> Year, CONCAT(name, ' ', surname) -> Therapist_Name} (J2)
Групирање и пресметка на агрегати
G ← {Year, id_user, Therapist_Name} σ COUNT(id_consultation) -> Total_Consultations, COUNT_IF(date_of_payment != NULL) -> Completed_Consultations, AVG(price) -> Avg_Consultation_Price (F1)
Пресметка на процент
P ← π{Year, id_user, Therapist_Name, Total_Consultations, Completed_Consultations, Avg_Consultation_Price, (Completed_Consultations/ Total_Consultations) * 100 -> Completion_Rate_Percentage} (G)
Подредување
R{final} ← τ{Year, Completion_Rate_Percentage DESC} (P)
Годишен извештај за честота на постирање блогови и број на коментари по блог кај луѓе кој имаат отидено на терапевт барем 10 пати, според тоа кој терапевт го посетуваат
WITH LoyalPatients AS (
SELECT
c.id_patient,
c.id_therapist,
u_t.name AS therapist_name,
u_t.surname AS therapist_surname
FROM project.consultation c
JOIN project.therapist t
ON t.id_user = c.id_therapist
JOIN project."user" u_t
ON u_t.id_user = t.id_user
GROUP BY
c.id_patient,
c.id_therapist,
u_t.name,
u_t.surname
HAVING COUNT(c.id_consultation) >= 10
),
BlogStats AS (
SELECT
b.id_patient,
EXTRACT(YEAR FROM b.date_of_post) AS post_year,
COUNT(DISTINCT b.id_blog) AS blogs_count,
COUNT(c.id_comment) AS comments_count
FROM project.blog b
LEFT JOIN project.comment c
ON c.id_blog = b.id_blog
GROUP BY
b.id_patient,
EXTRACT(YEAR FROM b.date_of_post)
)
SELECT
bs.post_year AS "Година",
lp.therapist_name || ' ' || lp.therapist_surname AS "Терапевт",
SUM(bs.blogs_count) AS "Вкупно објавени блогови",
SUM(bs.comments_count) AS "Вкупно примени коментари",
ROUND(AVG(bs.blogs_count), 2) AS "Просек блогови по пациент",
ROUND(
SUM(bs.comments_count)::DECIMAL
/ NULLIF(SUM(bs.blogs_count), 0),
2
) AS "Просек коментари по блог"
FROM LoyalPatients lp
JOIN BlogStats bs
ON bs.id_patient = lp.id_patient
GROUP BY
bs.post_year,
lp.id_therapist,
lp.therapist_name,
lp.therapist_surname
ORDER BY
bs.post_year DESC,
"Вкупно објавени блогови" DESC;
Релациона алгебра
- C(id_consultation, id_patient, id_therapist)
- T(id_user)
- U(id_user, name, surname)
- B(id_blog, id_patient, date_of_post)
- COM(id_comment, id_blog)
Дефинирање на LoyalPatients
J{lp} ← C ⨝{C.id_therapist = T.id_user} T ⨝{T.id_user = U.id_user} U
LP ← σ{count_c >= 10} ({id_patient, id_therapist, name, surname} σ{COUNT(id_consultation) -> count_c} (J{lp}))
Дефинирање на BlogStats
J{bs} ← B ⟕{B.id_blog = COM.id_blog} COM
F{bs} ← π{id_patient, id_blog, id_comment, YEAR(date_of_post) -> post_year} (J{bs})
BS ← {id_patient, post_year} σCOUNT(DISTINCT {id_blog} -> blogs_count, COUNT(id_comment) -> comments_count} (F{bs})
Поврзување и пресметка на агрегати
J{final} ← LP ⨝{LP.id_patient = BS.id_patient} BS
F{final} ← π{post_year, CONCAT(name, ' ', surname) -> Therapist, blogs_count, comments_count} (J{final})
G ← {post_year, Therapist} σ SUM(blogs_count) -> Total_Blogs, SUM(comments_count) -> Total_Comments, AVG(blogs_count) -> Avg_Blogs, SUM(comments_count)/SUM(blogs_count) -> Avg_Comments_Per_Blog (F{final})
Подредување
R{final} ← τ{post_year DESC, Total_Blogs DESC} (G)
Вкупна годишна анализа на блогови по месец во однос на внесување дневници во просек по месец
WITH Blog_Monthly AS (
SELECT
EXTRACT(YEAR FROM b.date_of_post) AS year,
EXTRACT(MONTH FROM b.date_of_post) AS month,
COUNT(b.id_blog) AS total_blogs,
COUNT(DISTINCT b.id_patient) AS active_bloggers
FROM project.blog b
GROUP BY 1, 2
),
Diary_Monthly AS (
SELECT
EXTRACT(YEAR FROM d.date) AS year,
EXTRACT(MONTH FROM d.date) AS month,
COUNT(d.id_diary) AS total_diaries,
COUNT(DISTINCT d.id_patient) AS active_diarists,
AVG(d.daily_rating) AS avg_monthly_mood
FROM project.diary d
GROUP BY 1, 2
),
Monthly_Stats AS (
SELECT
COALESCE(bm.year, dm.year) AS year,
COALESCE(bm.month, dm.month) AS month,
COALESCE(bm.total_blogs, 0) AS total_blogs,
COALESCE(bm.active_bloggers, 0) AS active_bloggers,
COALESCE(dm.total_diaries, 0) AS total_diaries,
COALESCE(dm.active_diarists, 0) AS active_diarists,
dm.avg_monthly_mood
FROM Blog_Monthly bm
FULL OUTER JOIN Diary_Monthly dm
ON bm.year = dm.year
AND bm.month = dm.month
)
SELECT
year AS "Година",
month AS "Месец",
total_blogs AS "Вкупно Блогови",
total_diaries AS "Вкупно Дневници",
ROUND(
total_blogs::NUMERIC / NULLIF(active_bloggers, 0),
2
) AS "Блогови по корисник",
ROUND(
total_diaries::NUMERIC / NULLIF(active_diarists, 0),
2
) AS "Дневници по корисник",
ROUND(avg_monthly_mood, 2) AS "Просечно Расположение (1-10)",
CASE
WHEN total_diaries > total_blogs * 2 THEN 'Highly Private (Introspective)'
WHEN total_blogs > total_diaries THEN 'Highly Social (Outspoken)'
ELSE 'Balanced'
END AS "Тип на Однесување",
ROUND(
total_blogs::NUMERIC / NULLIF(total_blogs + total_diaries, 0) * 100,
2
) || '%' AS "Јавност (%)"
FROM Monthly_Stats
ORDER BY year DESC, month DESC;
Релациона алгебра
- B(id_blog, id_patient, date_of_post)
- D(id_diary, id_patient, date, daily_rating)
Дефинирање на Blog_Monthly
F{bm} ← π{id_blog, id_patient, YEAR(date_of_post) -> year, MONTH(date_of_post) -> month} (B)
BM ← {year, month} σCOUNT(id_blog) -> total_blogs, COUNT(DISTINCT {id_patient}) -> active_bloggers} (F{bm})
Дефинирање на Diary_Monthly
F{dm} ← π{id_diary, id_patient, daily_rating, YEAR(date) -> year, MONTH(date) -> month} (D)
DM ← {year, month} σ{COUNT(id_diary) -> total_diaries, COUNT(DISTINCT id\_patient) -> active_diarists, AVG(daily_rating) -> avg_monthly_mood} (F{dm})
Поврзување на Monthly_Stats
MS ← BM ⟗{BM.year = DM.year ∧ BM.month = DM.month} DM
MS{final} ← π{COALESCE(BM.year, DM.year) -> year, COALESCE(BM.month, DM.month) -> month, ..., avg_monthly_mood} (MS)
Selection и Projection
P ← π{year, month, total_blogs, total_diaries, avg_monthly_mood, (total_blogs / active_bloggers) -> BlogsPerUser, (total_diaries / active_diarists) -> DiariesPerUser} (MS{final})
P{ext} ← π{*, CASE_WHEN}(...) -> BehaviourType, (total_blogs / (total_blogs + total_diaries)) * 100 -> PublicityRate} (P)
Подредување
R{final} ← τ{year DESC, month DESC} (P{ext})
