| Version 2 (modified by , 9 months ago) ( diff ) |
|---|
Напредни извештаи од базата (SQL и складирани процедури)
1. Извештај: Број на настани по година и земја
Опис: Овој извештај го прикажува бројот на настани по година, групирани според земјата.
SELECT
EXTRACT(YEAR FROM e.sql_date) AS year,
a.country_code,
COUNT(e.global_event_id) AS event_count
FROM
events e
JOIN
event_details ed ON e.global_event_id = ed.global_event_id
JOIN
actors a ON ed.actor_id = a.actor_id
GROUP BY
year, a.country_code
ORDER BY
year DESC, event_count DESC;
---
2. Извештај: Топ 5 актери според бројот на споменувања
Опис: Овој извештај ги прикажува топ 5 актери според бројот на споменувања во настани.
SELECT
a.actor_name,
COUNT(ed.actor_id) AS mention_count
FROM
event_details ed
JOIN
actors a ON ed.actor_id = a.actor_id
GROUP BY
a.actor_name
ORDER BY
mention_count DESC
LIMIT 5;
---
3. Извештај: Просечен тон на настани по месец
Опис: Овој извештај ја пресметува просечната вредност на тонот на настаните за секој месец.
SELECT
TO_CHAR(e.sql_date, 'YYYY-MM') AS month,
AVG(e.avg_tone) AS average_tone
FROM
events e
GROUP BY
month
ORDER BY
month DESC;
---
4. Извештај: Број на конфликти во квартален период по земја
Опис: Овој извештај го пресметува бројот на конфликти во тековниот квартал за секоја земја.
SELECT
EXTRACT(YEAR FROM e.sql_date) AS year,
EXTRACT(QUARTER FROM e.sql_date) AS quarter,
a.country_code,
COUNT(e.global_event_id) AS conflict_count
FROM
events e
JOIN
event_details ed ON e.global_event_id = ed.global_event_id
JOIN
actors a ON ed.actor_id = a.actor_id
WHERE
e.sql_date >= DATE_TRUNC('quarter', CURRENT_DATE)
GROUP BY
year, quarter, a.country_code
ORDER BY
year DESC, quarter DESC, conflict_count DESC;
---
5. Извештај: Конфликти според нивото на доверливост
Опис: Овој извештај ги групира настаните според нивото на доверливост на предвидувањето.
SELECT
e.event_code,
COUNT(e.global_event_id) AS event_count,
ROUND(AVG(p.confidence_score), 2) AS avg_confidence
FROM
events e
JOIN
predictions p ON e.global_event_id = p.event_id
GROUP BY
e.event_code
ORDER BY
avg_confidence DESC;
---
6. Извештај: Конфликти според број на извори
Опис: Ги прикажува најзначајните конфликти според бројот на извори што ги известиле.
SELECT
e.global_event_id,
e.sql_date,
e.event_code,
e.num_sources
FROM
events e
ORDER BY
e.num_sources DESC
LIMIT 10;
---
7. Извештај: Тренд на зголемување на конфликтите во последните 6 месеци
Опис: Ги прикажува земјите со најголемо зголемување на бројот на конфликти.
SELECT
a.country_code,
COUNT(e.global_event_id) AS conflict_count
FROM
events e
JOIN
event_details ed ON e.global_event_id = ed.global_event_id
JOIN
actors a ON ed.actor_id = a.actor_id
WHERE
e.sql_date >= CURRENT_DATE - INTERVAL '6 months'
GROUP BY
a.country_code
ORDER BY
conflict_count DESC
LIMIT 10;
---
8. Складирана процедура: Додавање на нов корисник
Опис: Додава нов корисник во системот.
CREATE OR REPLACE PROCEDURE add_new_user(
p_first_name VARCHAR,
p_last_name VARCHAR,
p_email VARCHAR,
p_password_hash VARCHAR,
p_role_id INT,
p_register_date DATE
) AS $$
BEGIN
INSERT INTO users (first_name, last_name, email, password_hash, role_id, register_date)
VALUES (p_first_name, p_last_name, p_email, p_password_hash, p_role_id, p_register_date);
END;
$$ LANGUAGE plpgsql;
---
9. Складирана процедура: Додавање нова претплата
Опис: Ја додава претплатата на корисник за следење на конфликти.
CREATE OR REPLACE PROCEDURE add_subscription(
p_user_id INT,
p_plan_id INT,
p_start_date DATE,
p_end_date DATE,
p_status VARCHAR
) AS $$
BEGIN
INSERT INTO subscription (user_id, plan_id, start_date, end_date, status)
VALUES (p_user_id, p_plan_id, p_start_date, p_end_date, p_status);
END;
$$ LANGUAGE plpgsql;
---
10. Складирана процедура: Ажурирање на статусот на корисник
Опис: Оваа процедура го ажурира статусот на даден корисник.
CREATE OR REPLACE PROCEDURE update_user_status(
p_user_id INT,
p_role_id INT
) AS $$
BEGIN
UPDATE users
SET role_id = p_role_id
WHERE user_id = p_user_id;
END;
$$ LANGUAGE plpgsql;
---
11. Складирана процедура: Генерирање на известувања за конфликти
Опис: Оваа процедура автоматски генерира известувања за корисниците кои следат одредени конфликти.
CREATE OR REPLACE PROCEDURE generate_notifications() AS $$
BEGIN
INSERT INTO notifications (user_id, event_id, notification_date, status)
SELECT
s.user_id,
e.global_event_id,
CURRENT_DATE,
'Pending'
FROM
subscription s
JOIN
events e ON s.plan_id = e.event_code
WHERE
e.sql_date >= CURRENT_DATE - INTERVAL '7 days';
END;
$$ LANGUAGE plpgsql;
