| | 2 | |
| | 3 | === 1. Извештај: Број на настани по година и земја === |
| | 4 | |
| | 5 | **Опис:** Овој извештај го прикажува бројот на настани по година, групирани според земјата. |
| | 6 | |
| | 7 | {{{ |
| | 8 | SELECT |
| | 9 | EXTRACT(YEAR FROM e.sql_date) AS year, |
| | 10 | a.country_code, |
| | 11 | COUNT(e.global_event_id) AS event_count |
| | 12 | FROM |
| | 13 | events e |
| | 14 | JOIN |
| | 15 | event_details ed ON e.global_event_id = ed.global_event_id |
| | 16 | JOIN |
| | 17 | actors a ON ed.actor_id = a.actor_id |
| | 18 | GROUP BY |
| | 19 | year, a.country_code |
| | 20 | ORDER BY |
| | 21 | year DESC, event_count DESC; |
| | 22 | }}} |
| | 23 | |
| | 24 | --- |
| | 25 | |
| | 26 | === 2. Извештај: Топ 5 актери според бројот на споменувања === |
| | 27 | |
| | 28 | **Опис:** Овој извештај ги прикажува топ 5 актери според бројот на споменувања во настани. |
| | 29 | |
| | 30 | {{{ |
| | 31 | SELECT |
| | 32 | a.actor_name, |
| | 33 | COUNT(ed.actor_id) AS mention_count |
| | 34 | FROM |
| | 35 | event_details ed |
| | 36 | JOIN |
| | 37 | actors a ON ed.actor_id = a.actor_id |
| | 38 | GROUP BY |
| | 39 | a.actor_name |
| | 40 | ORDER BY |
| | 41 | mention_count DESC |
| | 42 | LIMIT 5; |
| | 43 | }}} |
| | 44 | |
| | 45 | --- |
| | 46 | |
| | 47 | === 3. Извештај: Просечен тон на настани по месец === |
| | 48 | |
| | 49 | **Опис:** Овој извештај ја пресметува просечната вредност на тонот на настаните за секој месец. |
| | 50 | |
| | 51 | {{{ |
| | 52 | SELECT |
| | 53 | TO_CHAR(e.sql_date, 'YYYY-MM') AS month, |
| | 54 | AVG(e.avg_tone) AS average_tone |
| | 55 | FROM |
| | 56 | events e |
| | 57 | GROUP BY |
| | 58 | month |
| | 59 | ORDER BY |
| | 60 | month DESC; |
| | 61 | }}} |
| | 62 | |
| | 63 | --- |
| | 64 | |
| | 65 | === 4. Извештај: Број на конфликти во квартален период по земја === |
| | 66 | |
| | 67 | **Опис:** Овој извештај го пресметува бројот на конфликти во тековниот квартал за секоја земја. |
| | 68 | |
| | 69 | {{{ |
| | 70 | SELECT |
| | 71 | EXTRACT(YEAR FROM e.sql_date) AS year, |
| | 72 | EXTRACT(QUARTER FROM e.sql_date) AS quarter, |
| | 73 | a.country_code, |
| | 74 | COUNT(e.global_event_id) AS conflict_count |
| | 75 | FROM |
| | 76 | events e |
| | 77 | JOIN |
| | 78 | event_details ed ON e.global_event_id = ed.global_event_id |
| | 79 | JOIN |
| | 80 | actors a ON ed.actor_id = a.actor_id |
| | 81 | WHERE |
| | 82 | e.sql_date >= DATE_TRUNC('quarter', CURRENT_DATE) |
| | 83 | GROUP BY |
| | 84 | year, quarter, a.country_code |
| | 85 | ORDER BY |
| | 86 | year DESC, quarter DESC, conflict_count DESC; |
| | 87 | }}} |
| | 88 | |
| | 89 | --- |
| | 90 | |
| | 91 | === 5. Извештај: Конфликти според нивото на доверливост === |
| | 92 | |
| | 93 | **Опис:** Овој извештај ги групира настаните според нивото на доверливост на предвидувањето. |
| | 94 | |
| | 95 | {{{ |
| | 96 | SELECT |
| | 97 | e.event_code, |
| | 98 | COUNT(e.global_event_id) AS event_count, |
| | 99 | ROUND(AVG(p.confidence_score), 2) AS avg_confidence |
| | 100 | FROM |
| | 101 | events e |
| | 102 | JOIN |
| | 103 | predictions p ON e.global_event_id = p.event_id |
| | 104 | GROUP BY |
| | 105 | e.event_code |
| | 106 | ORDER BY |
| | 107 | avg_confidence DESC; |
| | 108 | }}} |
| | 109 | |
| | 110 | --- |
| | 111 | |
| | 112 | === 6. Извештај: Конфликти според број на извори === |
| | 113 | |
| | 114 | **Опис:** Ги прикажува најзначајните конфликти според бројот на извори што ги известиле. |
| | 115 | |
| | 116 | {{{ |
| | 117 | SELECT |
| | 118 | e.global_event_id, |
| | 119 | e.sql_date, |
| | 120 | e.event_code, |
| | 121 | e.num_sources |
| | 122 | FROM |
| | 123 | events e |
| | 124 | ORDER BY |
| | 125 | e.num_sources DESC |
| | 126 | LIMIT 10; |
| | 127 | }}} |
| | 128 | |
| | 129 | --- |
| | 130 | |
| | 131 | === 7. Извештај: Тренд на зголемување на конфликтите во последните 6 месеци === |
| | 132 | |
| | 133 | **Опис:** Ги прикажува земјите со најголемо зголемување на бројот на конфликти. |
| | 134 | |
| | 135 | {{{ |
| | 136 | SELECT |
| | 137 | a.country_code, |
| | 138 | COUNT(e.global_event_id) AS conflict_count |
| | 139 | FROM |
| | 140 | events e |
| | 141 | JOIN |
| | 142 | event_details ed ON e.global_event_id = ed.global_event_id |
| | 143 | JOIN |
| | 144 | actors a ON ed.actor_id = a.actor_id |
| | 145 | WHERE |
| | 146 | e.sql_date >= CURRENT_DATE - INTERVAL '6 months' |
| | 147 | GROUP BY |
| | 148 | a.country_code |
| | 149 | ORDER BY |
| | 150 | conflict_count DESC |
| | 151 | LIMIT 10; |
| | 152 | }}} |
| | 153 | |
| | 154 | --- |
| | 155 | |
| | 156 | === 8. Складирана процедура: Додавање на нов корисник === |
| | 157 | |
| | 158 | **Опис:** Додава нов корисник во системот. |
| | 159 | |
| | 160 | {{{ |
| | 161 | CREATE OR REPLACE PROCEDURE add_new_user( |
| | 162 | p_first_name VARCHAR, |
| | 163 | p_last_name VARCHAR, |
| | 164 | p_email VARCHAR, |
| | 165 | p_password_hash VARCHAR, |
| | 166 | p_role_id INT, |
| | 167 | p_register_date DATE |
| | 168 | ) AS $$ |
| | 169 | BEGIN |
| | 170 | INSERT INTO users (first_name, last_name, email, password_hash, role_id, register_date) |
| | 171 | VALUES (p_first_name, p_last_name, p_email, p_password_hash, p_role_id, p_register_date); |
| | 172 | END; |
| | 173 | $$ LANGUAGE plpgsql; |
| | 174 | }}} |
| | 175 | |
| | 176 | --- |
| | 177 | |
| | 178 | === 9. Складирана процедура: Додавање нова претплата === |
| | 179 | |
| | 180 | **Опис:** Ја додава претплатата на корисник за следење на конфликти. |
| | 181 | |
| | 182 | {{{ |
| | 183 | CREATE OR REPLACE PROCEDURE add_subscription( |
| | 184 | p_user_id INT, |
| | 185 | p_plan_id INT, |
| | 186 | p_start_date DATE, |
| | 187 | p_end_date DATE, |
| | 188 | p_status VARCHAR |
| | 189 | ) AS $$ |
| | 190 | BEGIN |
| | 191 | INSERT INTO subscription (user_id, plan_id, start_date, end_date, status) |
| | 192 | VALUES (p_user_id, p_plan_id, p_start_date, p_end_date, p_status); |
| | 193 | END; |
| | 194 | $$ LANGUAGE plpgsql; |
| | 195 | }}} |
| | 196 | |
| | 197 | --- |
| | 198 | |
| | 199 | === 10. Складирана процедура: Ажурирање на статусот на корисник === |
| | 200 | |
| | 201 | **Опис:** Оваа процедура го ажурира статусот на даден корисник. |
| | 202 | |
| | 203 | {{{ |
| | 204 | CREATE OR REPLACE PROCEDURE update_user_status( |
| | 205 | p_user_id INT, |
| | 206 | p_role_id INT |
| | 207 | ) AS $$ |
| | 208 | BEGIN |
| | 209 | UPDATE users |
| | 210 | SET role_id = p_role_id |
| | 211 | WHERE user_id = p_user_id; |
| | 212 | END; |
| | 213 | $$ LANGUAGE plpgsql; |
| | 214 | }}} |
| | 215 | |
| | 216 | --- |
| | 217 | |
| | 218 | === 11. Складирана процедура: Генерирање на известувања за конфликти === |
| | 219 | |
| | 220 | **Опис:** Оваа процедура автоматски генерира известувања за корисниците кои следат одредени конфликти. |
| | 221 | |
| | 222 | {{{ |
| | 223 | CREATE OR REPLACE PROCEDURE generate_notifications() AS $$ |
| | 224 | BEGIN |
| | 225 | INSERT INTO notifications (user_id, event_id, notification_date, status) |
| | 226 | SELECT |
| | 227 | s.user_id, |
| | 228 | e.global_event_id, |
| | 229 | CURRENT_DATE, |
| | 230 | 'Pending' |
| | 231 | FROM |
| | 232 | subscription s |
| | 233 | JOIN |
| | 234 | events e ON s.plan_id = e.event_code |
| | 235 | WHERE |
| | 236 | e.sql_date >= CURRENT_DATE - INTERVAL '7 days'; |
| | 237 | END; |
| | 238 | $$ LANGUAGE plpgsql; |
| | 239 | }}} |
| | 240 | |
| | 241 | |
| | 242 | |