DatabaseCreation: dml.sql

File dml.sql, 28.2 KB (added by 231069, 13 hours ago)
Line 
1-------------------------------------------------------------------------------------------------------
2--DML ZA GENERIRANJE PODATOCI
3INSERT INTO Kategorija (kod) VALUES
4('AM'),
5('A1'),
6('A2'),
7('A'),
8('B'),
9('C1'),
10('C'),
11('D1'),
12('D'),
13('BE'),
14('C1E'),
15('CE'),
16('D1E'),
17('DE'),
18('F'),
19('G');
20---------------------------------------------------------------------------------
21
22--Polnenje Gragjanin
23
24CREATE TABLE IF NOT EXISTS temp_maski_iminja (id BIGSERIAL PRIMARY KEY);
25CREATE TABLE IF NOT EXISTS temp_zenski_iminja (id BIGSERIAL PRIMARY KEY);
26CREATE TABLE IF NOT EXISTS temp_maski_preziminja (id BIGSERIAL PRIMARY KEY);
27CREATE TABLE IF NOT EXISTS temp_zenski_preziminja (id BIGSERIAL PRIMARY KEY);
28CREATE TABLE IF NOT EXISTS temp_adresi (id BIGSERIAL PRIMARY KEY);
29
30
31CREATE TEMP TABLE t_m_ime AS SELECT name as ime, row_number() over() as rn FROM temp_maski_iminja;
32CREATE TEMP TABLE t_m_prez AS SELECT surname as prezime, row_number() over() as rn FROM temp_maski_preziminja;
33CREATE TEMP TABLE t_z_ime AS SELECT name as ime, row_number() over() as rn FROM temp_zenski_iminja;
34CREATE TEMP TABLE t_z_prez AS SELECT surname_female as prezime, row_number() over() as rn FROM temp_zenski_preziminja;
35CREATE TEMP TABLE t_adr AS SELECT adresa, row_number() over() as rn FROM temp_adresi;
36
37
38CREATE TEMP TABLE t_broj AS
39SELECT
40 (SELECT count(*) FROM t_m_ime) as c_m_ime,
41 (SELECT count(*) FROM t_m_prez) as c_m_prez,
42 (SELECT count(*) FROM t_z_ime) as c_z_ime,
43 (SELECT count(*) FROM t_z_prez) as c_z_prez,
44 (SELECT count(*) FROM t_adr) as c_adr;
45
46
47----za zenski
48
49INSERT INTO Gragjanin (EMBG, ime, prezime, pol, adresa, datum_ragjanje)
50SELECT
51
52 (
53 to_char(g.d, 'DD') || -- DD
54 to_char(g.d, 'MM') || -- MM
55 right(to_char(g.d, 'YYYY'), 3) || -- YYY
56 (floor(random() * 9) + 41)::TEXT || -- RR (41 до 49)
57 '5' || -- G (5 za zenski)
58 lpad(floor(random() * 100)::TEXT, 2, '0') || -- NN (00 до 99)
59 floor(random() * 10)::TEXT -- C (0 до 9)
60 )::CHAR(13) as EMBG,
61 i.ime,
62 p.prezime,
63 'F',
64 a.adresa,
65 g.d
66FROM (
67 SELECT
68 gs.broj,
69 (CURRENT_DATE - INTERVAL '18 years' - (random() * INTERVAL '52 years'))::DATE as d
70 FROM generate_series(1, 1000000) gs(broj)
71) g
72CROSS JOIN t_broj b
73JOIN t_z_ime i ON i.rn = (g.broj % b.c_z_ime) + 1
74JOIN t_z_prez p ON p.rn = ((g.broj * 3) % b.c_z_prez) + 1
75JOIN t_adr a ON a.rn = ((g.broj * 7) % b.c_adr) + 1
76ON CONFLICT (EMBG) DO NOTHING;
77---za maski
78INSERT INTO Gragjanin (EMBG, ime, prezime, pol, adresa, datum_ragjanje)
79SELECT
80 (
81 to_char(g.d, 'DD') || -- DD
82 to_char(g.d, 'MM') || -- MM
83 right(to_char(g.d, 'YYYY'), 3) || -- YYY
84 (floor(random() * 9) + 41)::TEXT || -- RR(41 do 49)
85 '0' || -- G (0 za maski)
86 lpad(floor(random() * 100)::TEXT, 2, '0') || -- NN (00 do 99)
87 floor(random() * 10)::TEXT -- C (0 do 9)
88 )::CHAR(13) as EMBG,
89 i.ime,
90 p.prezime,
91 'M',
92 a.adresa,
93 g.d
94FROM (
95 SELECT
96 gs.broj,
97 (CURRENT_DATE - INTERVAL '18 years' - (random() * INTERVAL '52 years'))::DATE as d
98 FROM generate_series(1, 1000000) gs(broj)
99) g
100CROSS JOIN t_broj b
101JOIN t_m_ime i ON i.rn = (g.broj % b.c_m_ime) + 1
102JOIN t_m_prez p ON p.rn = ((g.broj * 3) % b.c_m_prez) + 1
103JOIN t_adr a ON a.rn = ((g.broj * 7) % b.c_adr) + 1
104ON CONFLICT (EMBG) DO NOTHING;
105
106
107DROP TABLE t_m_ime;
108DROP TABLE t_m_prez;
109DROP TABLE t_z_ime;
110DROP TABLE t_z_prez;
111DROP TABLE t_adr;
112DROP TABLE t_broj;
113
114DROP TABLE IF EXISTS temp_maski_iminja;
115DROP TABLE IF EXISTS temp_zenski_iminja;
116DROP TABLE IF EXISTS temp_maski_preziminja;
117DROP TABLE IF EXISTS temp_zenski_preziminja;
118DROP TABLE IF EXISTS temp_adresi;
119select * from gragjanin;
120
121------------------------------------------------------------------------------------------------
122--Polnenje policaec
123
124CREATE TEMP TABLE tmp_sefovi AS
125SELECT EMBG, row_number() over() - 1 as rn
126FROM Gragjanin
127WHERE datum_ragjanje < (CURRENT_DATE - INTERVAL '30 years')
128LIMIT 500;
129
130
131CREATE TEMP TABLE tmp_obicni AS
132SELECT EMBG, row_number() over() - 1 as rn
133FROM Gragjanin
134WHERE datum_ragjanje < (CURRENT_DATE - INTERVAL '21 years')
135 AND EMBG NOT IN (SELECT EMBG FROM tmp_sefovi)
136LIMIT 9500;
137
138
139INSERT INTO Policaec (EMBG_P, broj_na_znacka, EMBG_nadreden)
140SELECT
141 EMBG,
142 'ZN-S-' || LPAD((rn + 1)::text, 4, '0'),
143 NULL
144FROM tmp_sefovi;
145
146
147INSERT INTO Policaec (EMBG_P, broj_na_znacka, EMBG_nadreden)
148SELECT
149 o.EMBG,
150 'ZN-' || LPAD((o.rn + 1)::text, 6, '0'),
151 s.EMBG
152FROM tmp_obicni o
153JOIN tmp_sefovi s ON s.rn = (o.rn % 500);
154
155
156DROP TABLE tmp_sefovi;
157DROP TABLE tmp_obicni;
158
159-------------------------------------------------------------------------
160
161-- Polnenje sektor
162INSERT INTO Sektor (id_sektor, ime, region, telefon) VALUES
163(1, 'SVR Skopje', 'Skopski', '+38923111111'),
164(2, 'SVR Bitola', 'Pelagoniski', '+38947222222'),
165(3, 'SVR Kumanovo', 'Severoistocen', '+38931333333'),
166(4, 'SVR Shtip', 'Istocen', '+38932444444'),
167(5, 'SVR Tetovo', 'Pologski', '+38944555555'),
168(6, 'SVR Ohrid', 'Jugozapaden', '+38946666666'),
169(7, 'SVR Veles', 'Vardarski', '+38943777777'),
170(8, 'SVR Strumica', 'Jugoistocen', '+38934888888');
171
172-- Polnenje stanica
173INSERT INTO Stanica (ime, adresa, id_sektor) VALUES
174('PS Centar', 'ul. Goce Delcev br. 2, Skopje', 1),
175('PS Karposh', 'ul. Partizanski odredi br. 80, Skopje', 1),
176('PS Bit Pazar', 'ul. Krste Misirkov br. 1, Skopje', 1),
177('PS Bitola 1', 'ul. Shirok Sokak br. 100, Bitola', 2),
178('PS Prilep', 'ul. Mirce Acev br. 45, Prilep', 2),
179('PS Resen', 'ul. 29-ti Noemvri br. 5, Resen', 2),
180('PS Kumanovo', 'ul. 11-ti Oktomvri br. 1, Kumanovo', 3),
181('PS Kriva Palanka', 'ul. Marsal Tito br. 88, Kriva Palanka', 3),
182('PS Shtip', 'ul. Vanco Prke br. 30, Shtip', 4),
183('PS Kocani', 'ul. Marsal Tito br. 12, Kocani', 4),
184('PS Tetovo', 'ul. Ilindenska br. 10, Tetovo', 5),
185('PS Gostivar', 'ul. JNA br. 2, Gostivar', 5),
186('PS Ohrid', 'ul. Partizanska br. 1, Ohrid', 6),
187('PS Struga', 'ul. Marshal Tito br. 15, Struga', 6),
188('PS Kicevo', 'ul. Boris Kidric br. 4, Kicevo', 6),
189('PS Veles', 'ul. 8-mi Septemvri br. 22, Veles', 7),
190('PS Kavadarci', 'ul. Ilindenska br. 55, Kavadarci', 7),
191('PS Negotino', 'ul. Marsal Tito br. 10, Negotino', 7),
192('PS Strumica', 'ul. Leninova br. 4, Strumica', 8),
193('PS Gevgelija', 'ul. 7-mi Noemvri br. 2, Gevgelija', 8);
194
195CREATE TEMP TABLE temp_lokacii AS
196SELECT
197 g.EMBG,
198 split_part(g.adresa, ' ', array_length(string_to_array(g.adresa, ' '), 1)) as grad
199FROM Gragjanin g
200JOIN Policaec p ON g.EMBG = p.EMBG_P;
201
202
203INSERT INTO Raboti_vo (EMBG_P, id_stanica, datum_od)
204SELECT
205 tl.EMBG,
206 COALESCE(
207
208 (SELECT s.id_stanica
209 FROM Stanica s
210 WHERE split_part(s.adresa, ' ', array_length(string_to_array(s.adresa, ' '), 1)) = tl.grad
211 LIMIT 1),
212
213
214 (SELECT id_stanica
215 FROM Stanica
216 ORDER BY RANDOM()
217 LIMIT 1)
218 ) as id_stanica,
219 (CURRENT_DATE - INTERVAL '1 year' * floor(random() * 15 + 1))::DATE as d_od
220FROM temp_lokacii tl
221ON CONFLICT DO NOTHING;
222
223
224UPDATE Raboti_vo
225SET datum_do = datum_od + (random() * (CURRENT_DATE - datum_od))::int
226WHERE EMBG_P IN (
227 SELECT EMBG_P
228 FROM Raboti_vo
229 WHERE datum_do IS NULL
230 ORDER BY RANDOM()
231 LIMIT 1500
232);
233
234
235DROP TABLE temp_lokacii;
236---- update za policajci da imaat soodvetni sefovi
237
238WITH segashni_rabotni_mesta AS (
239 SELECT EMBG_P, id_stanica
240 FROM Raboti_vo
241 WHERE datum_do IS NULL
242),
243sefovi_po_stanica AS (
244 SELECT
245 rm.id_stanica,
246 array_agg(p.EMBG_P) as sefovi_niza,
247 count(*) as vkupno_sefovi
248 FROM Policaec p
249 JOIN segashni_rabotni_mesta rm ON p.EMBG_P = rm.EMBG_P
250 WHERE p.EMBG_nadreden IS NULL
251 GROUP BY rm.id_stanica
252)
253UPDATE Policaec p
254SET EMBG_nadreden = sps.sefovi_niza[floor(random() * sps.vkupno_sefovi) + 1]
255FROM segashni_rabotni_mesta rm
256JOIN sefovi_po_stanica sps ON rm.id_stanica = sps.id_stanica
257WHERE p.EMBG_P = rm.EMBG_P
258 AND p.EMBG_nadreden IS NOT NULL;
259
260-----------------------------------------------------------------------------
261---polnenje na vozilo
262
263INSERT INTO Vozilo (broj_na_sasija, model, id_kategorija)
264SELECT
265 upper(substring(md5(rand.i::text || rand.sasija_rand::text) from 1 for 17)),
266 CASE k.kat_id
267 WHEN 1 THEN (ARRAY['Tomos APN 6', 'Piaggio Zip 50', 'Peugeot Kisbee 50', 'Aprilia SR 50', 'Kymco Agility 50'])[floor(random()*5)+1]
268 WHEN 2 THEN (ARRAY['Yamaha MT-125', 'Honda CB125R', 'KTM 125 Duke', 'Aprilia RS 125'])[floor(random()*4)+1]
269 WHEN 3 THEN (ARRAY['Honda CB500F', 'Kawasaki Z400', 'Yamaha MT-03', 'KTM 390 Duke'])[floor(random()*4)+1]
270 WHEN 4 THEN (ARRAY['Yamaha MT-09', 'Kawasaki Z900', 'Honda CBR1000RR', 'BMW R 1250 GS', 'Suzuki Hayabusa'])[floor(random()*5)+1]
271 WHEN 5 THEN (ARRAY['VW Golf', 'Skoda Octavia', 'Opel Astra', 'Toyota Corolla', 'Renault Clio', 'Ford Focus', 'BMW 320d', 'Audi A4'])[floor(random()*8)+1]
272 WHEN 6 THEN (ARRAY['Iveco Daily', 'Mercedes Sprinter', 'Ford Transit', 'Fiat Ducato Maxi'])[floor(random()*4)+1]
273 WHEN 7 THEN (ARRAY['MAN TGS', 'Mercedes Actros', 'Volvo FH', 'Scania R-series', 'DAF XF'])[floor(random()*5)+1]
274 WHEN 8 THEN (ARRAY['Mercedes Sprinter Minibus', 'Ford Transit Minibus', 'Iveco Daily Minibus'])[floor(random()*3)+1]
275 WHEN 9 THEN (ARRAY['Mercedes Tourismo', 'Setra S 415', 'Neoplan Tourliner', 'MAN Lion''s Coach'])[floor(random()*4)+1]
276 WHEN 10 THEN (ARRAY['VW Touareg', 'Jeep Grand Cherokee', 'Toyota Hilux'])[floor(random()*3)+1]
277 WHEN 11 THEN (ARRAY['Iveco Daily Prikolica', 'Mercedes Sprinter Prikolica'])[floor(random()*2)+1]
278 WHEN 12 THEN (ARRAY['MAN TGX Poluprikolka', 'Volvo FH16 Prikolka', 'Scania S500 Prikolka'])[floor(random()*3)+1]
279 WHEN 13 THEN (ARRAY['Mercedes Minibus Prikolica', 'Ford Transit Prikolica'])[floor(random()*2)+1]
280 WHEN 14 THEN (ARRAY['Setra S 531 DT', 'Mercedes Travego Prikolica'])[floor(random()*2)+1]
281 WHEN 15 THEN (ARRAY['John Deere 5075', 'IMT 539', 'Massey Ferguson 5700', 'Zetor', 'New Holland T4'])[floor(random()*5)+1]
282 WHEN 16 THEN (ARRAY['Caterpillar 428', 'JCB 3CX', 'Bobcat S130', 'Komatsu Bager', 'IMT 506'])[floor(random()*5)+1]
283 END,
284 k.kat_id
285FROM (
286 SELECT
287 gs.i,
288 random() as r,
289 random() as sasija_rand
290 FROM generate_series(1, 1000000) gs(i)
291) rand
292CROSS JOIN LATERAL (
293 SELECT CASE
294 WHEN rand.r < 0.70 THEN 5
295 WHEN rand.r < 0.72 THEN 1
296 WHEN rand.r < 0.74 THEN 2
297 WHEN rand.r < 0.76 THEN 3
298 WHEN rand.r < 0.78 THEN 4
299 WHEN rand.r < 0.81 THEN 15
300 WHEN rand.r < 0.83 THEN 16
301 WHEN rand.r < 0.85 THEN 6
302 WHEN rand.r < 0.89 THEN 7
303 WHEN rand.r < 0.91 THEN 11
304 WHEN rand.r < 0.94 THEN 12
305 WHEN rand.r < 0.95 THEN 8
306 WHEN rand.r < 0.97 THEN 9
307 WHEN rand.r < 0.98 THEN 13
308 WHEN rand.r < 0.99 THEN 14
309 ELSE 10
310 END as kat_id
311) k
312ON CONFLICT (broj_na_sasija) DO NOTHING;
313-----------------------------------------------------------------------------
314--polnenje na boja_vozilo
315CREATE TABLE Katalog_Boi (
316 ime_boja varchar(30) PRIMARY KEY
317);
318WITH dostapni_boi AS (
319 SELECT array_agg(ime_boja) as boi_niza, count(*) as vkupno
320 FROM Katalog_Boi
321)
322INSERT INTO Boja_vozilo (broj_na_sasija, boja)
323SELECT
324 v.broj_na_sasija,
325 db.boi_niza[floor(random() * db.vkupno) + 1]
326FROM Vozilo v
327CROSS JOIN dostapni_boi db
328ON CONFLICT DO NOTHING;
329
330WITH dostapni_boi AS (
331 SELECT array_agg(ime_boja) as boi_niza, count(*) as vkupno
332 FROM Katalog_Boi
333)
334INSERT INTO Boja_vozilo (broj_na_sasija, boja)
335SELECT
336 v.broj_na_sasija,
337 db.boi_niza[floor(random() * db.vkupno) + 1]
338FROM Vozilo v
339CROSS JOIN dostapni_boi db
340WHERE random() < 0.15
341ON CONFLICT DO NOTHING;
342
343DROP TABLE Katalog_Boi;
344-------------------------------------------------------------------------
345-- polnenje Vozacka_dozvola
346INSERT INTO Vozacka_dozvola (broj_dozvola, datum_izdavanje, datum_vaznost_do, EMBG)
347SELECT
348 chr(floor(random() * 26 + 65)::int) || lpad(floor(random() * 9999999)::text, 7, '0') AS broj_dozvola,
349 g.izdadena_na_datum AS datum_izdavanje,
350 (g.izdadena_na_datum + INTERVAL '10 years')::date AS datum_vaznost_do,
351 g.EMBG
352FROM (
353 SELECT
354 EMBG,
355 CASE
356 WHEN datum_ragjanje > (CURRENT_DATE - INTERVAL '38 years')::DATE THEN
357 (datum_ragjanje + INTERVAL '18 years')::DATE + (random() * (CURRENT_DATE - (datum_ragjanje + INTERVAL '18 years')::DATE))::INT
358 ELSE
359 CURRENT_DATE - (random() * 7300)::INT
360 END AS izdadena_na_datum
361 FROM Gragjanin
362 WHERE datum_ragjanje < (CURRENT_DATE - INTERVAL '18 years')
363 AND random() < 0.65
364) g
365ON CONFLICT (broj_dozvola) DO NOTHING;
366
367select * from vozacka_dozvola vd
368------------------------------------------------------------------------------------------
369--polnenje na kategorija vozacka dozvola
370INSERT INTO Kategorija_Vozacka_dozvola (id_kategorija, broj_dozvola, datum_polaganje)
371SELECT
372 CASE WHEN random() < 0.90 THEN 5 ELSE 4 END,
373 broj_dozvola,
374 datum_izdavanje - (random() * 30 + 1)::INT
375FROM Vozacka_dozvola;
376
377INSERT INTO Kategorija_Vozacka_dozvola (id_kategorija, broj_dozvola, datum_polaganje)
378SELECT
379 4, broj_dozvola, datum_izdavanje - (random() * 60 + 1)::INT
380FROM Vozacka_dozvola
381WHERE random() < 0.15
382ON CONFLICT DO NOTHING;
383
384INSERT INTO Kategorija_Vozacka_dozvola (id_kategorija, broj_dozvola, datum_polaganje)
385SELECT
386 7, broj_dozvola, datum_izdavanje - (random() * 100 + 1)::INT
387FROM Vozacka_dozvola
388WHERE random() < 0.10
389ON CONFLICT DO NOTHING;
390
391INSERT INTO Kategorija_Vozacka_dozvola (id_kategorija, broj_dozvola, datum_polaganje)
392SELECT
393 12, broj_dozvola, datum_izdavanje - (random() * 10 + 1)::INT
394FROM Vozacka_dozvola
395WHERE random() < 0.05
396ON CONFLICT DO NOTHING;
397
398INSERT INTO Kategorija_Vozacka_dozvola (id_kategorija, broj_dozvola, datum_polaganje)
399SELECT
400 9, broj_dozvola, datum_izdavanje - (random() * 100 + 1)::INT
401FROM Vozacka_dozvola
402WHERE random() < 0.03
403ON CONFLICT DO NOTHING;
404
405INSERT INTO Kategorija_Vozacka_dozvola (id_kategorija, broj_dozvola, datum_polaganje)
406SELECT
407 15, broj_dozvola, datum_izdavanje - (random() * 300 + 1)::INT
408FROM Vozacka_dozvola
409WHERE random() < 0.08
410ON CONFLICT DO NOTHING;
411
412select * from kategorija_vozacka_dozvola kvd
413
414------------------------------------------------------------------------------
415DROP TABLE IF EXISTS tmp_sopstvenost_stage;
416CREATE TEMP TABLE tmp_sopstvenost_stage AS
417WITH vozila AS (
418 SELECT broj_na_sasija, row_number() OVER () - 1 AS rn
419 FROM Vozilo
420),
421gragjani AS (
422 SELECT EMBG, adresa, row_number() OVER () - 1 AS rn
423 FROM Gragjanin
424 WHERE datum_ragjanje < (CURRENT_DATE - INTERVAL '18 years')
425),
426cnt AS (SELECT count(*) AS cg FROM gragjani),
427baza AS (
428 -- tekoven sopstvenik
429 SELECT
430 v.broj_na_sasija,
431 g.EMBG,
432 g.adresa,
433 'tekoven'::varchar AS uloga,
434 (CURRENT_DATE - INTERVAL '4 years' - ((random()*120)::int) * INTERVAL '1 day')::DATE AS datum_steknuvanje,
435 NULL::DATE AS datum_kraj
436 FROM vozila v
437 CROSS JOIN cnt
438 JOIN gragjani g ON g.rn = (v.rn % cnt.cg)
439 UNION ALL
440 -- predhoden sopstvenik
441 SELECT
442 v.broj_na_sasija,
443 g.EMBG,
444 g.adresa,
445 'predhoden'::varchar AS uloga,
446 (CURRENT_DATE - INTERVAL '9 years' - ((random()*120)::int) * INTERVAL '1 day')::DATE AS datum_steknuvanje,
447 (CURRENT_DATE - INTERVAL '4 years 6 months' - ((random()*120)::int) * INTERVAL '1 day')::DATE AS datum_kraj
448 FROM vozila v
449 CROSS JOIN cnt
450 JOIN gragjani g ON g.rn = ((v.rn + 500000) % cnt.cg)
451)
452SELECT
453 b.broj_na_sasija,
454 b.EMBG,
455 b.uloga,
456 b.datum_steknuvanje,
457 b.datum_kraj,
458 COALESCE(
459 CASE split_part(b.adresa, ' ', array_length(string_to_array(b.adresa, ' '), 1))
460 WHEN 'Skopje' THEN 'SK' WHEN 'Skopje,' THEN 'SK'
461 WHEN 'Bitola' THEN 'BT' WHEN 'Bitola,' THEN 'BT'
462 WHEN 'Kumanovo' THEN 'KU' WHEN 'Kumanovo,' THEN 'KU'
463 WHEN 'Tetovo' THEN 'TE' WHEN 'Tetovo,' THEN 'TE'
464 WHEN 'Ohrid' THEN 'OH' WHEN 'Ohrid,' THEN 'OH'
465 WHEN 'Shtip' THEN 'ST' WHEN 'Shtip,' THEN 'ST'
466 WHEN 'Veles' THEN 'VE' WHEN 'Veles,' THEN 'VE'
467 WHEN 'Prilep' THEN 'PP' WHEN 'Prilep,' THEN 'PP'
468 WHEN 'Kocani' THEN 'KO' WHEN 'Kocani,' THEN 'KO'
469 WHEN 'Gostivar' THEN 'GV' WHEN 'Gostivar,' THEN 'GV'
470 WHEN 'Gevgelija' THEN 'GE' WHEN 'Gevgelija,' THEN 'GE'
471 WHEN 'Strumica' THEN 'SR' WHEN 'Strumica,' THEN 'SR'
472 ELSE (ARRAY['SK','BT','KU','TE','OH','ST','VE','PP','KO','GV','GE','SR'])[floor(random()*12)+1]
473 END, 'SK') AS region
474FROM baza b;
475
476
477-- Sekoj zapis dobiva globalen oid i reden broj vo ramki na regionot (za unikatni tablici)
478DROP TABLE IF EXISTS tmp_sopstvenost_plan;
479CREATE TEMP TABLE tmp_sopstvenost_plan AS
480SELECT
481 row_number() OVER () AS oid,
482 s.broj_na_sasija, s.EMBG, s.uloga, s.datum_steknuvanje, s.datum_kraj, s.region,
483 lpad((s.rn_reg % 10000)::text, 4, '0') AS p_broj,
484 chr((65 + (((s.rn_reg / 10000) / 26) % 26))::int) || chr((65 + ((s.rn_reg / 10000) % 26))::int) AS p_kod
485FROM (
486 SELECT *, (row_number() OVER (PARTITION BY region ORDER BY random()) - 1) AS rn_reg
487 FROM tmp_sopstvenost_stage
488) s;
489
490
491--polnenje na sopstvenost
492INSERT INTO Sopstvenost (EMBG, broj_na_sasija, datum_steknuvanje, datum_kraj)
493SELECT EMBG, broj_na_sasija, datum_steknuvanje, datum_kraj
494FROM tmp_sopstvenost_plan;
495
496-- polnenje na registerska tablica
497INSERT INTO Registerska_tablica (region, broj, kod)
498SELECT region, p_broj, p_kod
499FROM tmp_sopstvenost_plan;
500
501DROP TABLE IF EXISTS tmp_plan_ids;
502CREATE TEMP TABLE tmp_plan_ids AS
503SELECT
504 pl.oid, pl.uloga, pl.datum_steknuvanje, pl.datum_kraj,
505 so.id_sopstvenost, rt.id_tablica
506FROM tmp_sopstvenost_plan pl
507JOIN Sopstvenost so
508 ON so.EMBG = pl.EMBG
509 AND so.broj_na_sasija = pl.broj_na_sasija
510 AND so.datum_steknuvanje = pl.datum_steknuvanje
511JOIN Registerska_tablica rt
512 ON rt.region = pl.region
513 AND rt.broj = pl.p_broj
514 AND rt.kod = pl.p_kod;
515
516
517-- polnenje na registracija
518-- tekovni sopstvenosti
519INSERT INTO Registracija (id_sopstvenost, datum_na_izvadanje, datum_na_istekuvanje, id_tablica)
520SELECT
521 m.id_sopstvenost,
522 (CURRENT_DATE - ((3 - g.g) || ' years')::INTERVAL)::DATE,
523 (CURRENT_DATE - ((3 - g.g) || ' years')::INTERVAL + INTERVAL '1 year')::DATE,
524 m.id_tablica
525FROM tmp_plan_ids m
526CROSS JOIN generate_series(0, 2) AS g(g)
527WHERE m.uloga = 'tekoven';
528
529-- predhodni sopstvenosti
530INSERT INTO Registracija (id_sopstvenost, datum_na_izvadanje, datum_na_istekuvanje, id_tablica)
531SELECT
532 m.id_sopstvenost,
533 (CURRENT_DATE - ((7 - g.g) || ' years')::INTERVAL)::DATE,
534 (CURRENT_DATE - ((7 - g.g) || ' years')::INTERVAL + INTERVAL '1 year')::DATE,
535 m.id_tablica
536FROM tmp_plan_ids m
537CROSS JOIN generate_series(0, 1) AS g(g)
538WHERE m.uloga = 'predhoden';
539
540
541DROP TABLE tmp_sopstvenost_stage;
542DROP TABLE tmp_sopstvenost_plan;
543DROP TABLE tmp_plan_ids;
544
545select count(*) from Sopstvenost;
546select count(*) from Registerska_tablica;
547select count(*) from Registracija;
548
549
550-----------------------------------------------------------------
551--polnenje na Slucaj
552
553CREATE TABLE Tip_Nastan (
554 ime varchar(100) PRIMARY KEY
555);
556
557CREATE TABLE Tip_Zadaca (
558 opis varchar(255) PRIMARY KEY
559);
560
561
562
563
564WITH dostapni_nastani AS (
565 SELECT array_agg(ime) as n_arr, count(*) as n_cnt
566 FROM Tip_Nastan
567)
568INSERT INTO Slucaj (datum_otvaranje, status, tip_nastan)
569SELECT
570 datum,
571 CASE
572 WHEN datum < CURRENT_DATE - INTERVAL '6 months' THEN
573 CASE WHEN random() < 0.95 THEN 'Zatvoren' ELSE 'Vo tek' END
574 ELSE
575 CASE
576 WHEN random() < 0.4 THEN 'Otvoren'
577 WHEN random() < 0.8 THEN 'Vo tek'
578 ELSE 'Zatvoren'
579 END
580 END,
581 dn.n_arr[floor(random() * dn.n_cnt) + 1]
582FROM (
583 SELECT (CURRENT_DATE - (random() * 1825)::INT) as datum
584 FROM generate_series(1, 1000000)
585) d
586CROSS JOIN dostapni_nastani dn;
587
588------------------------------------------------------------------
589--polenje na Zadaca
590
591WITH policaici AS (
592 SELECT array_agg(EMBG_P) as p_arr, count(*) as p_cnt
593 FROM Policaec
594),
595dostapni_zadaci AS (
596 SELECT array_agg(opis) as z_arr, count(*) as z_cnt
597 FROM Tip_Zadaca
598)
599INSERT INTO Zadaca (opis, status, EMBG_policaec, id_slucaj)
600SELECT
601
602 dz.z_arr[(((s.id_slucaj + serija.broj) % dz.z_cnt) + 1)::INT],
603
604
605 CASE
606 WHEN s.status = 'Zatvoren' THEN
607 CASE WHEN random() < 0.85 THEN 'Zavrsena' ELSE 'Otkazana' END
608 WHEN s.status = 'Otvoren' THEN
609 CASE WHEN random() < 0.90 THEN 'Aktivna' ELSE 'Zavrsena' END
610 WHEN s.status = 'Vo tek' THEN
611 CASE
612 WHEN random() < 0.40 THEN 'Zavrsena'
613 WHEN random() < 0.80 THEN 'Aktivna'
614 ELSE 'Otkazana'
615 END
616 END,
617
618 p.p_arr[floor(random() * p.p_cnt) + 1],
619 s.id_slucaj
620FROM Slucaj s
621CROSS JOIN policaici p
622CROSS JOIN dostapni_zadaci dz
623
624CROSS JOIN LATERAL generate_series(1, (floor(random() * 3) + 3)::INT) AS serija(broj);
625
626
627----------------------------------------------------------------------------------------
628
629
630
631---------polnenje na zapisnik
632
633CREATE TEMP TABLE tmp_v AS SELECT broj_na_sasija, row_number() over() - 1 as rn FROM Vozilo;
634CREATE TEMP TABLE tmp_g AS SELECT EMBG, row_number() over() - 1 as rn FROM Gragjanin WHERE datum_ragjanje < (CURRENT_DATE - INTERVAL '18 years');
635
636
637CREATE TEMP TABLE tmp_p AS
638SELECT
639 rv.EMBG_P,
640 row_number() over() - 1 as rn,
641 CASE s.ime
642 WHEN 'PS Centar' THEN ARRAY['Bulevar Partizanski Odredi', 'Ulica Makedonija', 'Dimitrije Cupovski', '11-ti Oktomvri']
643 WHEN 'PS Karposh' THEN ARRAY['Bulevar Ilinden', 'Ulica Ruzveltova', 'Bulevar 8-mi Septemvri', 'Moskovska']
644 WHEN 'PS Bit Pazar' THEN ARRAY['Bulevar Krste Misirkov', 'Ulica Cvetan Dimov', 'Plasticharska', 'Nikola Karev']
645 WHEN 'PS Bitola 1' THEN ARRAY['Shirok Sokak', 'Bulevar 1-vi Maj', 'Ulica Prilepska', 'Partizanska']
646 WHEN 'PS Prilep' THEN ARRAY['Bulevar Goce Delcev', 'Ulica Prilepski Braniteli', 'Aleksandar Makedonski']
647 WHEN 'PS Kumanovo' THEN ARRAY['Treta Makedonska Udarna Brigada', '11-ti Oktomvri', 'Oktomvriska Revolucija']
648 WHEN 'PS Tetovo' THEN ARRAY['Bulevar Ilindenska', 'Bulevar Vidoe Smilevski-Bato', 'Blagoja Toska']
649 WHEN 'PS Ohrid' THEN ARRAY['Bulevar Turisticka', 'Ulica Partizanska', 'Kej Makedonija', 'Jane Sandanski']
650 WHEN 'PS Shtip' THEN ARRAY['Ulica Vanco Prke', 'Bulevar Goce Delcev', 'Zeleznicka']
651 WHEN 'PS Veles' THEN ARRAY['Ulica 8-mi Septemvri', 'Ulica Blagoj Gjorev', 'Alekso Demnievski']
652 WHEN 'PS Strumica' THEN ARRAY['Bulevar Leninova', 'Blagoj Jankov Mucheto', 'Marshal Tito']
653 WHEN 'PS Gostivar' THEN ARRAY['Bulevar Bratsva i Edinstva', 'Ulica JNA', 'Ilindenska']
654 WHEN 'PS Kocani' THEN ARRAY['Marsal Tito', 'Teodosija Paunov', 'Dimitar Vlahov']
655 WHEN 'PS Kavadarci' THEN ARRAY['Ilindenska', '7-mi Septemvri', 'Meto Dija']
656 WHEN 'PS Gevgelija' THEN ARRAY['7-mi Noemvri', 'Sava Mihajlov', 'Zeleznicka']
657 ELSE ARRAY['Glavna Ulica', 'Bulevar Osloboduvanje', 'Ulica Marsal Tito', 'Lokalni Patishta']
658 END as dostapni_ulici
659FROM Raboti_vo rv
660JOIN Stanica s ON rv.id_stanica = s.id_stanica
661WHERE rv.datum_do IS NULL;
662
663
664CREATE TEMP TABLE tmp_c AS
665SELECT
666 (SELECT count(*) FROM tmp_v) as cv,
667 (SELECT count(*) FROM tmp_g) as cg,
668 (SELECT count(*) FROM tmp_p) as cp;
669
670
671INSERT INTO Zapisnik (vreme, datum, lokacija, Potpis, status_zapisnik, id_slucaj, Vozilo_Broj_Sasija, EMBG_Prekrsuvach, EMBG_Policaec)
672SELECT
673 (TIME '00:00:00' + random() * (TIME '23:59:59' - TIME '00:00:00'))::time as vreme,
674 s.datum_otvaranje as datum,
675 p.dostapni_ulici[floor(random() * array_length(p.dostapni_ulici, 1)) + 1] as lokacija,
676 random() < 0.85 as Potpis,
677 -- statusot na zapisnikot zavisi od statusot na slucajot kon koj pripaga:
678 -- zatvoren slucaj => zapisnikot e skoro sekogas zatvoren; otvoren slucaj => zapisnikot e otvoren
679 CASE
680 WHEN s.status = 'Zatvoren' THEN CASE WHEN random() < 0.95 THEN 'Zatvoren' ELSE 'Otvoren' END
681 WHEN s.status = 'Vo tek' THEN CASE WHEN random() < 0.50 THEN 'Zatvoren' ELSE 'Otvoren' END
682 ELSE 'Otvoren'
683 END as status_zapisnik,
684 s.id_slucaj,
685 v.broj_na_sasija,
686 g.EMBG,
687 p.EMBG_P
688FROM (
689 SELECT id_slucaj, datum_otvaranje, status, row_number() over() - 1 as rn
690 FROM Slucaj
691 CROSS JOIN generate_series(1, 15)
692 LIMIT 10000000
693) s
694CROSS JOIN tmp_c c
695JOIN tmp_v v ON v.rn = (s.rn % c.cv)
696JOIN tmp_g g ON g.rn = (s.rn % c.cg)
697JOIN tmp_p p ON p.rn = (s.rn % c.cp);
698
699
700DROP TABLE tmp_v;
701DROP TABLE tmp_g;
702DROP TABLE tmp_p;
703DROP TABLE tmp_c;
704
705
706
707
708---update na zapisnik za razlicen broj na zapisnici po policaec
709
710
711
712DROP TABLE IF EXISTS tmp_pool_rabota;
713CREATE TEMP TABLE tmp_pool_rabota AS
714SELECT
715 rv.EMBG_P,
716 rv.datum_od,
717 COALESCE(rv.datum_do, CURRENT_DATE) AS datum_do,
718 trim(split_part(s.adresa, ',', 2)) AS grad,
719 GREATEST(1, (power(random(), 4) * 30 + 1)::INT) AS tezina
720FROM Raboti_vo rv
721JOIN Stanica s ON rv.id_stanica = s.id_stanica;
722
723
724DROP TABLE IF EXISTS tmp_zap_grad;
725CREATE TEMP TABLE tmp_zap_grad AS
726SELECT
727 z.id_na_zapisnik,
728 trim(split_part(s.adresa, ',', 2)) AS grad
729FROM Zapisnik z
730JOIN Raboti_vo rv ON rv.EMBG_P = z.EMBG_Policaec
731 AND z.datum BETWEEN rv.datum_od AND COALESCE(rv.datum_do, CURRENT_DATE)
732JOIN Stanica s ON rv.id_stanica = s.id_stanica;
733
734
735UPDATE Zapisnik z
736SET EMBG_Policaec = (
737 SELECT pr.EMBG_P
738 FROM tmp_pool_rabota pr, tmp_zap_grad tz
739 WHERE tz.id_na_zapisnik = z.id_na_zapisnik
740 AND pr.grad = tz.grad
741 AND z.datum BETWEEN pr.datum_od AND pr.datum_do
742 ORDER BY -ln(1.0 - random()) / pr.tezina
743 LIMIT 1
744);
745
746DROP TABLE tmp_pool_rabota;
747DROP TABLE tmp_zap_grad;
748
749------------------------------------------------------------------------------------
750---polnenje stavka zapisnik
751
752
753
754INSERT INTO Stavka_Zapisnik (reden_broj, id_na_zapisnik, id_na_prekrsok)
755SELECT
756 row_number() OVER (PARTITION BY z.id_na_zapisnik) as reden_broj,
757 z.id_na_zapisnik,
758 p.id_prekrsok
759FROM Zapisnik z
760CROSS JOIN LATERAL (
761
762 SELECT (floor(random() * 3 + (z.id_na_zapisnik * 0)) + 1)::INT as limit_val
763) r
764CROSS JOIN LATERAL (
765
766 SELECT id_prekrsok
767 FROM Prekrsok
768 ORDER BY random() + (z.id_na_zapisnik * 0)
769 LIMIT r.limit_val
770) p;
771
772
773------------polnenje uplata
774
775TRUNCATE TABLE Uplata RESTART IDENTITY;
776
777
778INSERT INTO Uplata (iznos, status, datum_uplata, Uplatil_Gragjanin, id_zapisnik, nacin_plakanje)
779SELECT
780 0,
781
782
783 CASE WHEN (id_na_zapisnik::bigint * 137) % 100 < 70 THEN 'Plateno' ELSE 'Neplateno' END,
784
785
786 CASE WHEN (id_na_zapisnik::bigint * 137) % 100 < 70
787 THEN LEAST(datum + ((id_na_zapisnik::bigint * 113) % 30)::int, CURRENT_DATE)
788 ELSE NULL
789 END,
790
791 EMBG_Prekrsuvach,
792 id_na_zapisnik,
793
794 CASE
795 WHEN (id_na_zapisnik::bigint * 137) % 100 < 45 THEN 'E-bankarstvo'
796 WHEN (id_na_zapisnik::bigint * 137) % 100 < 65 THEN 'Platezna karticka'
797 WHEN (id_na_zapisnik::bigint * 137) % 100 < 70 THEN 'Gotovo/Uplatnica'
798 ELSE NULL
799 END
800FROM Zapisnik;
801
802
803DROP TABLE IF EXISTS tmp_suma_zapisnici;
804
805
806CREATE TEMP TABLE tmp_suma_zapisnici AS
807SELECT
808 sz.id_na_zapisnik,
809 SUM(k.iznos_kazna) as vkupen_iznos
810FROM Stavka_Zapisnik sz
811JOIN Prekrsok p ON sz.id_na_prekrsok = p.id_prekrsok
812JOIN Kazna k ON p.id_kazna = k.id_kazna
813GROUP BY sz.id_na_zapisnik;
814
815ALTER TABLE tmp_suma_zapisnici ADD PRIMARY KEY (id_na_zapisnik);
816
817UPDATE Uplata u
818SET iznos = ts.vkupen_iznos
819FROM tmp_suma_zapisnici ts
820WHERE u.id_zapisnik = ts.id_na_zapisnik;
821
822
823DROP TABLE tmp_suma_zapisnici;