QueryOptimization: views.sql

File views.sql, 13.6 KB (added by 231069, 8 hours ago)
Line 
1
2---------------------VIEWS-------------------------------------------------------------------------------
3
4
5---- Listanje na site zapisnici so osnovnite koloni
6CREATE OR REPLACE VIEW v_site_zapisnici AS
7SELECT
8 id_na_zapisnik,
9 datum,
10 vreme,
11 lokacija,
12 Potpis,
13 id_slucaj,
14 EMBG_Prekrsuvach,
15 Vozilo_Broj_Sasija,
16 EMBG_Policaec
17FROM Zapisnik;
18
19
20
21-- Listanje na zapisnici so site detali: prekrsitel, vozilo, policaec,
22-- tip prekrsok, iznos na kazna i status na uplata.
23
24CREATE OR REPLACE VIEW v_zapisnici_detalno AS
25SELECT
26 z.id_na_zapisnik,z.datum,z.vreme,z.lokacija,z.id_slucaj,
27 g.EMBG AS embg_prekrsitel,g.ime AS prekrsitel_ime,g.prezime AS prekrsitel_prezime,
28 v.broj_na_sasija, v.model AS vozilo_model,pol.EMBG_P AS embg_policaec,
29 g_p.ime AS policaec_ime,g_p.prezime AS policaec_prezime,
30 p.ime AS prekrsok,
31 k.iznos_kazna,
32 u.iznos AS iznos_uplata,u.status AS status_uplata
33FROM Zapisnik z
34LEFT JOIN Gragjanin g ON z.EMBG_Prekrsuvach = g.EMBG
35LEFT JOIN Vozilo v ON z.Vozilo_Broj_Sasija = v.broj_na_sasija
36LEFT JOIN Policaec pol ON z.EMBG_Policaec = pol.EMBG_P
37LEFT JOIN Gragjanin g_p ON pol.EMBG_P = g_p.EMBG
38LEFT JOIN Stavka_Zapisnik sz ON z.id_na_zapisnik = sz.id_na_zapisnik
39LEFT JOIN Prekrsok p ON sz.id_na_prekrsok = p.id_prekrsok
40LEFT JOIN Kazna k ON p.id_kazna = k.id_kazna
41LEFT JOIN Uplata u ON z.id_na_zapisnik = u.id_zapisnik;
42
43
44
45-- Site neplateni kazni so podatoci za prekrsitelot, prekrsokot, iznosot
46-- i kolku denovi se vekje neplateni.
47
48CREATE OR REPLACE VIEW v_neplateni_kazni AS
49SELECT
50 z.id_na_zapisnik,z.datum AS datum_prekrsok,z.lokacija,
51 g.EMBG AS embg_prekrsitel,g.ime AS ime_prekrsitel, g.prezime AS prezime_prekrsitel,
52 p.ime AS prekrsok,
53 k.iznos_kazna,
54 u.iznos AS iznos_za_naplata,
55 (CURRENT_DATE - z.datum) AS denovi_neplateno
56FROM Uplata u
57JOIN Zapisnik z ON u.id_zapisnik = z.id_na_zapisnik
58JOIN Gragjanin g ON z.EMBG_Prekrsuvach = g.EMBG
59JOIN Stavka_Zapisnik sz ON z.id_na_zapisnik = sz.id_na_zapisnik
60JOIN Prekrsok p ON sz.id_na_prekrsok = p.id_prekrsok
61JOIN Kazna k ON p.id_kazna = k.id_kazna
62WHERE u.status = 'Neplateno';
63
64
65
66
67-- Pokazuva koi gragjani povtoruvaat eden ist tip prekrsok (COUNT > 1).
68-- Vrakja kolku pati, prv i posleden pat, i vkupen iznos kazni za toj prekrsok.
69CREATE OR REPLACE VIEW v_povtoreni_prekrsoci AS
70WITH Prekrsoci_Stats AS (
71 SELECT
72 z.EMBG_Prekrsuvach,
73 sz.id_na_prekrsok,
74 COUNT(*) AS broj_povtori,
75 MIN(z.datum) AS prv_pat,
76 MAX(z.datum) AS posleden_pat,
77 SUM(k.iznos_kazna) AS vkupen_iznos_kazni
78 FROM Zapisnik z
79 JOIN Stavka_Zapisnik sz ON z.id_na_zapisnik = sz.id_na_zapisnik
80 JOIN Prekrsok p ON sz.id_na_prekrsok = p.id_prekrsok
81 JOIN Kazna k ON p.id_kazna = k.id_kazna
82 GROUP BY z.EMBG_Prekrsuvach, sz.id_na_prekrsok
83 HAVING COUNT(*) > 1
84)
85SELECT
86 g.EMBG,g.ime,g.prezime,
87 p.id_prekrsok,p.ime AS prekrsok,
88 ps.broj_povtori,ps.prv_pat,ps.posleden_pat,ps.vkupen_iznos_kazni
89FROM Prekrsoci_Stats ps
90JOIN Gragjanin g ON ps.EMBG_Prekrsuvach = g.EMBG
91JOIN Prekrsok p ON ps.id_na_prekrsok = p.id_prekrsok;
92
93select * from v_povtoreni_prekrsoci vpp
94
95-- Prosek na izdadeni zapisnici po policaec: vkupno zapisnici, prv i posleden,
96-- aktivni meseci i prosechen broj zapisnici po mesec aktivnost.
97CREATE OR REPLACE VIEW v_policajci_prosek_zapisnici AS
98WITH Policaec_Stats AS (
99 SELECT
100 EMBG_Policaec,
101 COUNT(id_na_zapisnik) AS vkupno_zapisnici,
102 MIN(datum) AS prv_zapisnik,
103 MAX(datum) AS posleden_zapisnik
104 FROM Zapisnik
105 GROUP BY EMBG_Policaec
106)
107SELECT
108 pol.EMBG_P,pol.broj_na_znacka,
109 g.ime AS policaec_ime,g.prezime AS policaec_prezime,
110 ps.vkupno_zapisnici,ps.prv_zapisnik,ps.posleden_zapisnik,
111 GREATEST(DATE_PART('year', AGE(ps.posleden_zapisnik, ps.prv_zapisnik)) * 12 +
112 DATE_PART('month', AGE(ps.posleden_zapisnik, ps.prv_zapisnik)), 1) AS aktivni_meseci,
113 (ps.vkupno_zapisnici::numeric /
114 GREATEST(DATE_PART('year', AGE(ps.posleden_zapisnik, ps.prv_zapisnik)) * 12 +
115 DATE_PART('month', AGE(ps.posleden_zapisnik, ps.prv_zapisnik)),
116 1)::numeric) AS prosek_zapisnici_po_mesec
117FROM Policaec_Stats ps
118JOIN Policaec pol ON ps.EMBG_Policaec = pol.EMBG_P
119JOIN Gragjanin g ON pol.EMBG_P = g.EMBG;
120
121
122select *
123from v_policaici_prosek_zapisnici vppz
124
125
126
127-- Istorija/profil za sekoj gragjanin: vkupno prekrshoci, vkupno platenо,
128-- vkupen dolg, prv i posleden prekrshok, broj na razlichni tipovi prekrshoci.
129CREATE OR REPLACE VIEW v_istorija_gragjanin AS
130WITH Zapisnik_Stats AS (
131 SELECT
132 EMBG_Prekrsuvach,
133 COUNT(DISTINCT z.id_na_zapisnik) AS vkupno_zapisnici,
134 MIN(z.datum) AS prv_prekrsok,
135 MAX(z.datum) AS posleden_prekrsok,
136 COUNT(sz.id_stavka) AS vkupno_prekrshoci,
137 COUNT(DISTINCT sz.id_na_prekrsok) AS razlichni_tipovi,
138 COALESCE(SUM(k.iznos_kazna), 0) AS vkupen_iznos_kazni
139 FROM Zapisnik z
140 LEFT JOIN Stavka_Zapisnik sz ON z.id_na_zapisnik = sz.id_na_zapisnik
141 LEFT JOIN Prekrsok p ON sz.id_na_prekrsok = p.id_prekrsok
142 LEFT JOIN Kazna k ON p.id_kazna = k.id_kazna
143 GROUP BY EMBG_Prekrsuvach
144),
145Uplata_Stats AS (
146 SELECT
147 z.EMBG_Prekrsuvach,
148 COALESCE(SUM(CASE WHEN u.status = 'Plateno' THEN u.iznos END), 0) AS vkupno_plateno,
149 COALESCE(SUM(CASE WHEN u.status = 'Neplateno' THEN u.iznos END), 0) AS vkupen_dolg,
150 COUNT(CASE WHEN u.status = 'Neplateno' THEN u.id_uplata END) AS broj_neplateni
151 FROM Uplata u
152 JOIN Zapisnik z ON u.id_zapisnik = z.id_na_zapisnik
153 GROUP BY z.EMBG_Prekrsuvach
154)
155SELECT
156 g.EMBG,g.ime,g.prezime,g.datum_ragjanje,
157 zs.vkupno_zapisnici,zs.vkupno_prekrshoci,zs.razlichni_tipovi,zs.vkupen_iznos_kazni,
158 COALESCE(us.vkupno_plateno, 0) AS vkupno_plateno,
159 COALESCE(us.vkupen_dolg, 0) AS vkupen_dolg,
160 COALESCE(us.broj_neplateni, 0) AS broj_neplateni,
161 zs.prv_prekrsok,
162 zs.posleden_prekrsok
163FROM Gragjanin g
164JOIN Zapisnik_Stats zs ON g.EMBG = zs.EMBG_Prekrsuvach
165LEFT JOIN Uplata_Stats us ON g.EMBG = us.EMBG_Prekrsuvach;
166
167
168
169
170select * from v_istorija_gragjanin vig
171
172
173------------------------INDEKSI---------------------------------------------------
174
175--za v_site_zapisnici
176
177select *
178from v_site_zapisnici vsz
179where vsz.embg_prekrsuvach='1508004480145'
180
181--insert
182
183INSERT INTO Zapisnik
184(vreme, datum, lokacija, Potpis, id_slucaj, EMBG_Prekrsuvach, Vozilo_Broj_Sasija, EMBG_Policaec)
185VALUES
186('16:40:00', '2025-07-11', 'Bulevar Partizanski Odredi', true, 1, '1508004480145', 'CB6BC94C191376CC6', '1101960480659');
187--update
188 UPDATE Zapisnik
189SET
190
191 Potpis = false,
192 vreme = '17:15:00'
193WHERE id_na_zapisnik = 30000006;
194
195--posle indeks za v_site_zapisnici
196
197CREATE INDEX idx_zapisnik_prekrsuvach ON Zapisnik(EMBG_Prekrsuvach);
198--insert posle indeks
199INSERT INTO Zapisnik
200(vreme, datum, lokacija, Potpis, id_slucaj, EMBG_Prekrsuvach, Vozilo_Broj_Sasija, EMBG_Policaec)
201VALUES
202('16:40:00', '2025-07-11', 'Bulevar Partizanski Odredi', true, 1, '1508004480145', 'CB6BC94C191376CC6', '1101960480659');
203
204--update posle indeks
205 UPDATE Zapisnik
206SET
207
208 Potpis = false,
209 vreme = '18:15:00'
210WHERE id_na_zapisnik = 30000011;
211
212--za v_zapisnici_detalno
213
214SELECT * FROM v_zapisnici_detalno
215WHERE embg_prekrsitel = '0412992470302';
216
217--insert
218
219INSERT INTO Stavka_Zapisnik
220(reden_broj, id_na_zapisnik, id_na_prekrsok)
221VALUES
222(1, 30000006, 1);
223
224select * from stavka_zapisnik sz
225where sz.id_na_zapisnik =30000006;
226
227--update
228UPDATE Stavka_Zapisnik
229SET
230 id_na_prekrsok = 2
231WHERE id_na_zapisnik = 30000006 and id_stavka =32910317;
232
233--insert posle indeks
234INSERT INTO Stavka_Zapisnik
235(reden_broj, id_na_zapisnik, id_na_prekrsok)
236VALUES
237(1, 30000011, 1);
238
239select * from stavka_zapisnik sz
240where sz.id_na_zapisnik =30000011;
241
242--update posle indeks
243UPDATE Stavka_Zapisnik
244SET
245 id_na_prekrsok = 2
246WHERE id_na_zapisnik = 30000011 and id_stavka =32910318;
247
248
249-- za v_neplateni_kazni
250select *
251from v_neplateni_kazni vnk
252where vnk.embg_prekrsitel ='0412992470302';
253
254
255--insert
256INSERT INTO Uplata
257(iznos, status, datum_uplata, Uplatil_Gragjanin, id_zapisnik, nacin_plakanje)
258VALUES
259(50, 'Neplateno', NULL, '0412992470302', 30000006, NULL);
260
261--update
262UPDATE Uplata
263SET
264 status = 'Plateno',
265 datum_uplata = CURRENT_DATE,
266 nacin_plakanje = 'Platezna karticka'
267WHERE id_zapisnik = 30000006;
268
269--posle indeks
270
271
272CREATE INDEX idx_stavka_zapisnik_id_zapisnik ON stavka_zapisnik(id_na_zapisnik);
273
274
275CREATE INDEX idx_uplata_id_zapisnik ON uplata(id_zapisnik);
276
277--insert posle indeks
278INSERT INTO Uplata
279(iznos, status, datum_uplata, Uplatil_Gragjanin, id_zapisnik, nacin_plakanje)
280VALUES
281(50, 'Neplateno', NULL, '0412992470302', 30000006, NULL);
282
283-- update posle indeks
284UPDATE Uplata
285SET
286 status = 'Plateno',
287 datum_uplata = CURRENT_DATE,
288 nacin_plakanje = 'Platezna karticka'
289WHERE id_zapisnik = 30000006;
290
291select *
292from uplata u
293where u.id_zapisnik =30000006
294
295-- za v_policaici_prosek_zapisnici
296select *
297from v_policaici_prosek_zapisnici vppz
298where vppz.embg_p ='3007982480021'
299
300--za v_povtoreni_prekrsoci
301
302select *
303from v_povtoreni_prekrsoci vpp
304where vpp.embg ='0412992470302'
305
306
307--za v_istorija_gragjanin
308select *
309from v_istorija_gragjanin vig
310where vig.embg ='0412992470302'
311
312
313-- za v_policaici_prosek_zapisnici
314select *
315from v_policaici_prosek_zapisnici vppz
316where vppz.policaec_ime ='Никола'
317
318
319
320--za v_povtoreni_prekrsoci
321
322select *
323from v_povtoreni_prekrsoci vpp
324where vpp.ime ='Виолета'
325
326
327--za v_istorija_gragjanin
328select *
329from v_istorija_gragjanin vig
330where vig.ime='Оливера'
331
332
333
334----materialized
335 --view #4
336CREATE MATERIALIZED VIEW v_povtoreni_prekrsoci_mv AS
337WITH Prekrsoci_Stats AS (
338 SELECT
339 z.EMBG_Prekrsuvach,
340 sz.id_na_prekrsok,
341 COUNT(*) AS broj_povtori,
342 MIN(z.datum) AS prv_pat,
343 MAX(z.datum) AS posleden_pat,
344 SUM(k.iznos_kazna) AS vkupen_iznos_kazni
345 FROM Zapisnik z
346 JOIN Stavka_Zapisnik sz ON z.id_na_zapisnik = sz.id_na_zapisnik
347 JOIN Prekrsok p ON sz.id_na_prekrsok = p.id_prekrsok
348 JOIN Kazna k ON p.id_kazna = k.id_kazna
349 GROUP BY z.EMBG_Prekrsuvach, sz.id_na_prekrsok
350 HAVING COUNT(*) > 1
351)
352SELECT
353 g.EMBG,g.ime,g.prezime,
354 p.id_prekrsok,p.ime AS prekrsok,
355 ps.broj_povtori,ps.prv_pat,ps.posleden_pat,ps.vkupen_iznos_kazni
356FROM Prekrsoci_Stats ps
357JOIN Gragjanin g ON ps.EMBG_Prekrsuvach = g.EMBG
358JOIN Prekrsok p ON ps.id_na_prekrsok = p.id_prekrsok;
359
360select *
361from v_povtoreni_prekrsoci_mv vppm
362where vppm.embg ='0412992470302'
363
364
365-- view #5
366CREATE MATERIALIZED VIEW v_policaici_prosek_zapisnici_mv AS
367WITH Policaec_Stats AS (
368 SELECT
369 EMBG_Policaec,
370 COUNT(id_na_zapisnik) AS vkupno_zapisnici,
371 MIN(datum) AS prv_zapisnik,
372 MAX(datum) AS posleden_zapisnik
373 FROM Zapisnik
374 GROUP BY EMBG_Policaec
375)
376SELECT
377 pol.EMBG_P,pol.broj_na_znacka,
378 g.ime AS policaec_ime,g.prezime AS policaec_prezime,
379 ps.vkupno_zapisnici,ps.prv_zapisnik,ps.posleden_zapisnik,
380 GREATEST(DATE_PART('year', AGE(ps.posleden_zapisnik, ps.prv_zapisnik)) * 12 +
381 DATE_PART('month', AGE(ps.posleden_zapisnik, ps.prv_zapisnik)), 1) AS aktivni_meseci,
382 (ps.vkupno_zapisnici::numeric /
383 GREATEST(DATE_PART('year', AGE(ps.posleden_zapisnik, ps.prv_zapisnik)) * 12 +
384 DATE_PART('month', AGE(ps.posleden_zapisnik, ps.prv_zapisnik)),
385 1)::numeric) AS prosek_zapisnici_po_mesec
386FROM Policaec_Stats ps
387JOIN Policaec pol ON ps.EMBG_Policaec = pol.EMBG_P
388JOIN Gragjanin g ON pol.EMBG_P = g.EMBG;
389
390
391select *
392from v_policaici_prosek_zapisnici_mv vppzm
393where vppzm.broj_na_znacka ='ZN-S-0006'
394
395
396-- view #6
397CREATE MATERIALIZED VIEW v_istorija_gragjanin_mv AS
398WITH Zapisnik_Stats AS (
399 SELECT
400 EMBG_Prekrsuvach,
401 COUNT(DISTINCT z.id_na_zapisnik) AS vkupno_zapisnici,MIN(z.datum) AS prv_prekrsok,MAX(z.datum) AS posleden_prekrsok,
402 COUNT(sz.id_stavka) AS vkupno_prekrshoci,COUNT(DISTINCT sz.id_na_prekrsok) AS razlichni_tipovi,
403 COALESCE(SUM(k.iznos_kazna), 0) AS vkupen_iznos_kazni
404 FROM Zapisnik z
405 LEFT JOIN Stavka_Zapisnik sz ON z.id_na_zapisnik = sz.id_na_zapisnik
406 LEFT JOIN Prekrsok p ON sz.id_na_prekrsok = p.id_prekrsok
407 LEFT JOIN Kazna k ON p.id_kazna = k.id_kazna
408 GROUP BY EMBG_Prekrsuvach
409),
410Uplata_Stats AS (
411 SELECT
412 z.EMBG_Prekrsuvach,
413 COALESCE(SUM(CASE WHEN u.status = 'Plateno' THEN u.iznos END), 0) AS vkupno_plateno,
414 COALESCE(SUM(CASE WHEN u.status = 'Neplateno' THEN u.iznos END), 0) AS vkupen_dolg,
415 COUNT(CASE WHEN u.status = 'Neplateno' THEN u.id_uplata END) AS broj_neplateni
416 FROM Uplata u
417 JOIN Zapisnik z ON u.id_zapisnik = z.id_na_zapisnik
418 GROUP BY z.EMBG_Prekrsuvach
419)
420SELECT
421 g.EMBG,g.ime,g.prezime,g.datum_ragjanje,
422 zs.vkupno_zapisnici,zs.vkupno_prekrshoci,zs.razlichni_tipovi,zs.vkupen_iznos_kazni,
423 COALESCE(us.vkupno_plateno, 0) AS vkupno_plateno,
424 COALESCE(us.vkupen_dolg, 0) AS vkupen_dolg,
425 COALESCE(us.broj_neplateni, 0) AS broj_neplateni,
426 zs.prv_prekrsok,zs.posleden_prekrsok
427FROM Gragjanin g
428JOIN Zapisnik_Stats zs ON g.EMBG = zs.EMBG_Prekrsuvach
429LEFT JOIN Uplata_Stats us ON g.EMBG = us.EMBG_Prekrsuvach;
430
431select *
432from v_istorija_gragjanin_mv vig
433where vig.prezime='Петровски'
434
435
436-----------refresh
437REFRESH MATERIALIZED VIEW v_povtoreni_prekrsoci_mv;
438REFRESH MATERIALIZED VIEW v_policaici_prosek_zapisnici_mv;
439REFRESH MATERIALIZED VIEW v_istorija_gragjanin_mv;