DatabaseCreation: dml.sql

File dml.sql, 23.2 KB (added by 231109, 13 days ago)
Line 
1---Person Nina ---------
2
3CREATE TEMP TABLE _temp_female_names (
4 id SERIAL PRIMARY KEY,
5 name TEXT
6);
7
8DROP TABLE IF EXISTS _temp_female_names CASCADE ;
9
10truncate table person cascade;
11
12select * from person limit 1000;
13
14-------EMPLOYEE Nina-----------
15INSERT INTO employee (personembg, position, companycompany_id)
16SELECT
17 embg,
18 (ARRAY['TrainDriver','AssistantDriver','Conductor','SignalOperator',
19 'MaintenanceWorker','StationMaster','Chef','Waiter','Cashier'])
20 [(row_num % 9) + 1],
21 ((row_num % 4) + 1) AS company_id
22FROM (
23 SELECT
24 embg,
25 row_number() OVER (ORDER BY random()) as row_num
26 FROM person
27 LIMIT 30000
28) sorted_people;
29
30select count(*) from employee;
31select * from employee limit 1000;
32
33
34---------PASSENGER Nina---------------------
35
36INSERT INTO passenger (PersonEMBG, passenger_id)
37SELECT
38 p.embg,
39 row_number() OVER (ORDER BY random()) as passenger_id
40FROM Person p
41LEFT JOIN Employee e ON p.embg = e.personembg
42WHERE e.personembg IS NULL
43ORDER BY random()
44LIMIT 800000;
45
46select count(*) from passenger;
47select * from passenger limit 1000;
48
49
50------------RESERVATION Nina------------------------
51
52TRUNCATE TABLE Reservation RESTART identity cascade;
53
54INSERT INTO Reservation (status, expiry_time, Passengerpassenger_id, PassengerPersonEMBG2)
55SELECT
56 (ARRAY['Confirmed', 'Pending', 'Cancelled', 'Expired', 'Checked-in'])
57 [(s.i % 5) + 1],
58 CURRENT_DATE + (floor(random() * 180))::int,
59 p.passenger_id,
60 p.PersonEMBG
61FROM generate_series(1, 3000000) s(i)
62JOIN Passenger p ON p.passenger_id = ((s.i % 800000) + 1);
63
64select count(*) from reservation;
65select * from reservation limit 1000;
66
67
68-------------PAYMENT Nina-------------------------
69ALTER TABLE payment
70ALTER COLUMN amount TYPE NUMERIC(10, 2);
71
72ALTER TABLE payment
73ALTER COLUMN transaction_date TYPE TIMESTAMP;
74
75
76--CREATE INDEX idx_payment_reservation_id ON Payment(Reservationreservation_id);
77--CREATE INDEX idx_payment_date ON Payment(transaction_date);
78
79ALTER TABLE payment ALTER COLUMN reservationreservation_id DROP NOT NULL;
80
81TRUNCATE TABLE payment RESTART identity cascade;
82
83INSERT INTO payment (payment_method, amount, transaction_date, reservationreservation_id, passengerpassenger_id, passengerpersonembg2)
84SELECT
85 (ARRAY['Credit Card', 'Debit Card', 'PayPal', 'Cash', 'Apple Pay'])[floor(random() * 5 + 1)],
86 (random() * 140 + 10)::numeric(10,2),
87 (expiry_time::timestamp - (random() * interval '5 days')) + (random() * interval '24 hours'),
88 reservation_id,
89 passengerpassenger_id,
90 passengerpersonembg2
91FROM reservation;
92
93INSERT INTO payment (payment_method, amount, transaction_date, reservationreservation_id, passengerpassenger_id, passengerpersonembg2)
94SELECT
95 (ARRAY['Credit Card', 'Debit Card', 'PayPal', 'Cash', 'Apple Pay'])[floor(random() * 5 + 1)],
96 (random() * 140 + 10)::numeric(10,2),
97 NOW() - (random() * interval '180 days'),
98 NULL,
99 p.passenger_id,
100 p.PersonEMBG
101FROM generate_series(1, 9000000) s(i)
102JOIN Passenger p ON p.passenger_id = ((s.i % 800000) + 1);
103
104select count(*) from payment;
105select * from payment limit 1000;
106
107
108--------ROUTE Nina----------------
109
110ALTER TABLE Route
111ALTER COLUMN route_name TYPE VARCHAR(100);
112
113
114TRUNCATE TABLE Route RESTART identity cascade;
115
116INSERT INTO Route (route_name, type)
117SELECT
118 start_city || ' - ' || end_city,
119 (floor(random() * 3) + 1)::int
120FROM (
121 SELECT
122 a.city AS start_city,
123 b.city AS end_city
124 FROM (
125 VALUES
126 ('Rome'), ('Milan'), ('Naples'), ('Turin'), ('Palermo'), ('Genoa'),
127 ('Bologna'), ('Florence'), ('Bari'), ('Catania'), ('Venice'), ('Verona'),
128 ('Messina'), ('Trieste'), ('Taranto'), ('Prato'), ('Modena'), ('Parma'),
129 ('Reggio Emilia'), ('Perugia'), ('Livorno'), ('Ravenna'), ('Foggia'),
130 ('Rimini'), ('Salerno'), ('Ferrara'), ('Sassari'), ('Latina'),
131 ('Giugliano'), ('Monza'), ('Siracusa'), ('Pescara')
132 ) AS a(city)
133 CROSS JOIN (
134 VALUES
135 ('Rome'), ('Milan'), ('Naples'), ('Turin'), ('Palermo'), ('Genoa'),
136 ('Bologna'), ('Florence'), ('Bari'), ('Catania'), ('Venice'), ('Verona'),
137 ('Messina'), ('Trieste'), ('Taranto'), ('Prato'), ('Modena'), ('Parma'),
138 ('Reggio Emilia'), ('Perugia'), ('Livorno'), ('Ravenna'), ('Foggia'),
139 ('Rimini'), ('Salerno'), ('Ferrara'), ('Sassari'), ('Latina'),
140 ('Giugliano'), ('Monza'), ('Siracusa'), ('Pescara')
141 ) AS b(city)
142 WHERE a.city <> b.city
143 ORDER BY random()
144 LIMIT 1000
145) AS combinations;
146
147select count(*) from route;
148select * from route limit 300;
149
150
151--------Employee_performs_maintenance Nina---------------
152TRUNCATE TABLE employee_performs_maintenance cascade ;
153
154INSERT INTO employee_performs_maintenance (employeeemployee_id, employeepersonembg2, maintenancemaintenance_id)
155SELECT
156 e.employee_id,
157 e.personembg,
158 m.maintenance_id
159FROM maintenance m
160CROSS JOIN LATERAL (
161 SELECT employee_id, personembg
162 FROM employee
163 WHERE position = 'MaintenanceWorker'
164 ORDER BY m.maintenance_id, random()
165 LIMIT (floor(random() * 3) + 1)::int
166) e;
167
168
169select count(*) from employee_performs_maintenance;
170select * from employee_performs_maintenance limit 1000;
171TRUNCATE TABLE employee_performs_maintenance;
172
173SELECT *
174FROM employee
175WHERE position = 'MaintenanceWorker';
176
177---------train_undergoes_maintenance Nina-------------------
178TRUNCATE TABLE train_undergoes_maintenance;
179
180INSERT INTO train_undergoes_maintenance (traintrain_id, maintenancemaintenance_id)
181SELECT DISTINCT
182 t.train_id,
183 m.maintenance_id
184FROM (
185 SELECT maintenance_id, random() as rnd FROM maintenance
186) m
187JOIN LATERAL (
188 SELECT train_id
189 FROM train
190 WHERE m.rnd = m.rnd
191 ORDER BY random()
192 LIMIT (floor(random() * 2) + 1)::int
193) t ON TRUE
194ON CONFLICT DO NOTHING;
195
196select count(*) from train_undergoes_maintenance;
197select * from train_undergoes_maintenance limit 1000;
198
199
200/*company Marija*/
201----------------------------------------------
202INSERT INTO company (company_id, name, contact_info)
203VALUES
204(1, 'Trenitalia', '+39 06 5210550 | info@trenitalia.it'),
205(2, 'Italo', '+39 89 20 20 | ufficiostampa@ntvspa.it'),
206(3, 'Trenord', '+39 02 72494949 | support@trenord.it'),
207(4, 'EAV', '+39 081 7722444 | info@eavsrl.it');
208-------------------------------------------------------
209
210/*train Marija*/
211
212INSERT INTO Train (
213 train_number,
214 type,
215 manufacture_year,
216 capacity,
217 max_speed,
218 Companycompany_id,
219 Routeroute_id
220)
221SELECT
222 (1000 + s.i)::int,
223 (ARRAY['Freight', 'Passenger', 'High-Speed', 'Commuter', 'Monorail', 'Maglev', 'Subway', 'Intercity'])[floor(random() * 8 + 1)],
224 (floor(random() * (2026 - 2010 + 1)) + 2010)::text,
225 floor(random() * 400 + 50)::int,
226 floor(random() * 200 + 100)::int,
227 (SELECT company_id FROM Company
228 WHERE (s.i * 0) = 0
229 ORDER BY random() LIMIT 1),
230 (SELECT route_id FROM Route
231 WHERE (s.i * 0) = 0
232 ORDER BY random() LIMIT 1)
233FROM generate_series(1, 2500) AS s(i);
234select * from train limit 1000;
235
236TRUNCATE TABLE train RESTART identity cascade;
237
238-------------------------------------------------------
239/*station Marija*/
240ALTER TABLE station ALTER COLUMN station_name TYPE VARCHAR(100);
241ALTER TABLE station ALTER COLUMN city TYPE VARCHAR(50);
242
243
244INSERT INTO station (station_name, country, city, address)
245SELECT
246 loc.station_name,
247 'Italy' as country,
248 loc.city,
249 loc.address
250FROM generate_series(1, 2200) AS s(i)
251CROSS JOIN LATERAL (
252 SELECT * FROM (
253 VALUES
254 ('Milano Centrale', 'Milano', 'Piazza Duca d''Aosta, 1'),
255 ('Roma Termini', 'Roma', 'Via Giovanni Giolitti, 40'),
256 ('Napoli Centrale', 'Napoli', 'Piazza Garibaldi'),
257 ('Firenze Santa Maria Novella', 'Firenze', 'Piazza della Stazione'),
258 ('Venezia Santa Lucia', 'Venezia', 'Fondamenta Santa Lucia'),
259 ('Torino Porta Nuova', 'Torino', 'Corso Vittorio Emanuele II, 58'),
260 ('Bologna Centrale', 'Bologna', 'Piazza delle Medaglie d''Oro'),
261 ('Verona Porta Nuova', 'Verona', 'Piazzale XXV Aprile'),
262 ('Genova Piazza Principe', 'Genova', 'Piazza Acquaverde'),
263 ('Bari Centrale', 'Bari', 'Piazza Aldo Moro'),
264 ('Palermo Centrale', 'Palermo', 'Piazza Giulio Cesare'),
265 ('Trieste Centrale', 'Trieste', 'Piazza della Libertà , 8'),
266 ('Pisa Centrale', 'Pisa', 'Piazza della Stazione'),
267 ('Salerno', 'Salerno', 'Piazza Vittorio Veneto'),
268 ('Venezia Mestre', 'Venezia', 'Viale Stazione'),
269 ('Padova', 'Padova', 'Piazzale della Stazione'),
270 ('Reggio Di Calabria Centrale', 'Reggio Calabria', 'Piazza Giuseppe Garibaldi')
271 ) AS v(station_name, city, address)
272 WHERE (s.i * 0) = 0
273 ORDER BY random()
274 LIMIT 1
275) AS loc;
276
277select * from station limit 1000;
278select count(*) from station;
279
280TRUNCATE TABLE station RESTART identity cascade;
281
282-------------------------------------------------------
283/*segment Marija*/
284INSERT INTO segment (length_km, type, max_speed, status, stationstation_id3)
285SELECT
286 (floor(random() * 99) + 1)::numeric(2),
287 (ARRAY['Standard', 'High-Speed', 'Tunnel', 'Bridge', 'Urban', 'Mountain'])[floor(random() * 6 + 1)],
288 (floor(random() * 241) + 60)::int,
289 (ARRAY['Active', 'Maintenance', 'Inactive', 'Under Construction'])[floor(random() * 4 + 1)],
290 rand_station.station_id
291FROM generate_series(1, 5000) AS s(i)
292CROSS JOIN LATERAL (
293 SELECT station_id FROM station
294 WHERE (s.i * 0) = 0
295 ORDER BY random()
296 LIMIT 1
297) AS rand_station;
298
299select * from segment limit 1000;
300select count(*) from segment;
301
302-------------------------------------------------------
303/*maintenance Marija*/
304
305INSERT INTO maintenance (maintenance_date, description, stationstation_id, segmentsegment_id)
306SELECT
307 CURRENT_DATE - (floor(random() * 365) || ' days')::interval,
308 (ARRAY['Routine ', 'Emergency ', 'Scheduled ', 'Quarterly ', 'Post-incident '])[floor(random() * 5 + 1)] ||
309 (ARRAY['inspection of ', 'repair of ', 'cleaning of ', 'structural check on ', 'electrical test for '])[floor(random() * 5 + 1)] ||
310 (ARRAY['track alignment', 'signaling system', 'platform safety', 'ventilation', 'overhead cables'])[floor(random() * 5 + 1)],
311 rand_data.station_id,
312 rand_data.segment_id
313FROM generate_series(1, 50000) AS s(i)
314CROSS JOIN LATERAL (
315 SELECT
316 (SELECT station_id FROM station WHERE (s.i * 0) = 0 ORDER BY random() LIMIT 1) as station_id,
317 (SELECT segment_id FROM segment WHERE (s.i * 0) = 0 ORDER BY random() LIMIT 1) as segment_id
318) AS rand_data;
319
320select * from maintenance limit 1000;
321select count(*) from maintenance;
322
323TRUNCATE TABLE maintenance RESTART identity cascade;
324
325-------------------------------------------------------
326/*plaform Marija*/
327
328INSERT INTO platform (stationstation_id, platform_id, platform_number)
329SELECT
330 rand_station.station_id,
331 s.i,
332 floor(random() * 20 + 1)::int
333FROM generate_series(1, 8000) AS s(i)
334CROSS JOIN LATERAL (
335 SELECT station_id FROM station
336 WHERE (s.i * 0) = 0
337 ORDER BY random()
338 LIMIT 1
339) AS rand_station;
340
341select * from platform limit 1000;
342select count(*) from platform;
343
344-------------------------------------------------------
345/*schedule Marija*/
346
347INSERT INTO schedule (day_of_week, departure_time, arrival_time, status, routeroute_id, traintrain_id)
348SELECT
349 (floor(random() * 7) + 1)::text::bpchar(1),
350 dep_date,
351 dep_date + (floor(random() * 2))::int,
352 (ARRAY['On Time', 'Delayed', 'Cancelled', 'Scheduled'])[floor(random() * 4 + 1)],
353 routes.route_id,
354 trains.train_id
355FROM (
356 SELECT
357 CURRENT_DATE + (floor(random() * 30))::int AS dep_date,
358 random() as r1,
359 random() as r2
360 FROM generate_series(1, 12000000)
361) AS s
362JOIN (
363 SELECT route_id, row_number() OVER () as rn, count(*) OVER () as total
364 FROM route
365) AS routes ON routes.rn = floor(s.r1 * routes.total) + 1
366JOIN (
367 SELECT train_id, row_number() OVER () as rn, count(*) OVER () as total
368 FROM train
369) AS trains ON trains.rn = floor(s.r2 * trains.total) + 1;
370
371select count(*) from schedule;
372select * from schedule limit 1000;
373
374-------------------------------------------------------
375/*train trip Marija*/
376INSERT INTO "Train Trip" (
377 departure_time,
378 arrival_time,
379 trip_status,
380 delay_minutes,
381 routeroute_id,
382 traintrain_id,
383 employeeemployee_id,
384 employeepersonembg2,
385 platformstationstation_id,
386 platformplatform_id
387)
388SELECT
389 s.dep_date,
390 (s.dep_date + (CASE WHEN random() > 0.9 THEN interval '1 day' ELSE interval '0 days' END)),
391 (ARRAY['Completed', 'Delayed', 'On Time', 'Cancelled', 'In Transit'])[floor(random() * 5 + 1)],
392 (CASE WHEN random() > 0.85 THEN floor(random() * 181)::int ELSE 0 END),
393 r.route_id,
394 t.train_id,
395 e.employee_id,
396 e.personembg,
397 p.stationstation_id,
398 p.platform_id
399FROM (
400 SELECT
401 (CURRENT_DATE - (floor(random() * 90) || ' days')::interval)::timestamp AS dep_date,
402 random() as r1, random() as r2, random() as r3, random() as r4,
403 generate_series(1, 500000)
404) AS s
405JOIN (SELECT route_id, row_number() OVER () as rn, count(*) OVER () as total FROM route) r
406 ON r.rn = floor(s.r1 * r.total) + 1
407JOIN (SELECT train_id, row_number() OVER () as rn, count(*) OVER () as total FROM train) t
408 ON t.rn = floor(s.r2 * t.total) + 1
409JOIN (SELECT employee_id, personembg, row_number() OVER () as rn, count(*) OVER () as total FROM employee) e
410 ON e.rn = floor(s.r3 * e.total) + 1
411JOIN (SELECT stationstation_id, platform_id, row_number() OVER () as rn, count(*) OVER () as total FROM platform) p
412 ON p.rn = floor(s.r4 * p.total) + 1;
413
414COMMIT;
415
416select count(*) from "Train Trip";
417select * from "Train Trip" limit 1000;
418
419TRUNCATE TABLE "Train Trip" RESTART identity cascade;
420
421
422select count(*) from train_undergoes_maintenance;
423select * from train_undergoes_maintenance limit 1000;
424
425-----Train Service Ana---------------
426WITH trip_rows AS (
427 SELECT
428 row_number() OVER (ORDER BY trip_id) AS rn,
429 trip_id,
430 departure_time,
431 arrival_time,
432 Traintrain_id
433 FROM "Train Trip"
434),
435train_rows AS (
436 SELECT
437 row_number() OVER (ORDER BY train_id) AS rn,
438 train_id,
439 type
440 FROM Train
441),
442trip_count AS (
443 SELECT count(*) AS cnt FROM trip_rows
444)
445INSERT INTO "Train Service"
446(service_id, service_type, opening_time, closing_time, "Train Triptrip_id", Traintrain_id)
447SELECT
448 gs AS service_id,
449 trn.type AS service_type,
450
451 CASE
452 WHEN gs % 2 = 0 THEN make_date(2026, 4 + (gs % 9), 1 + (gs % 28))
453 ELSE make_date(2027, 1 + (gs % 12), 1 + (gs % 28))
454 END AS opening_time,
455
456 CASE
457 WHEN gs % 2 = 0 THEN make_date(2026, 4 + (gs % 9), 1 + (gs % 28)) + (gs % 3)
458 ELSE make_date(2027, 1 + (gs % 12), 1 + (gs % 28)) + (gs % 3)
459 END AS closing_time,
460
461 t.trip_id AS "Train Triptrip_id",
462 t.Traintrain_id AS Traintrain_id
463FROM generate_series(1, 120000) AS gs
464CROSS JOIN trip_count tc
465JOIN trip_rows t
466 ON t.rn = (((gs * 97) - 1) % tc.cnt) + 1
467JOIN train_rows trn
468 ON trn.train_id = t.Traintrain_id;
469
470---------Employe_operates_Train Service Ana-------------------
471INSERT INTO "Employee_operates_Train Service"
472(Employeeemployee_id, EmployeePersonEMBG2)
473SELECT DISTINCT
474 e.employee_id,
475 e.PersonEMBG
476FROM Employee e
477WHERE e.position IN ('TrainDriver', 'AssistantDriver', 'Conductor', 'SignalOperator', 'StationMaster')
478ORDER BY e.employee_id
479LIMIT 90000
480ON CONFLICT (Employeeemployee_id, EmployeePersonEMBG2) DO NOTHING;
481
482
483---------Route_Segment Ana----------------------
484TRUNCATE TABLE Route_Segment;
485
486INSERT INTO Route_Segment (
487 Routeroute_id,
488 Segmentsegment_id,
489 sequence_number,
490 stops_at_segment,
491 is_station_stop,
492 Stationstation_id,
493 distance_from_start,
494 estimated_time_offset
495)
496WITH base AS (
497 SELECT DISTINCT
498 r.route_id AS Routeroute_id,
499 s.segment_id AS Segmentsegment_id,
500 st.station_id AS Stationstation_id,
501 CASE
502 WHEN random() > 0.65 THEN 1
503 ELSE 0
504 END AS is_station_stop,
505 random() AS rand_order
506 FROM (
507 SELECT
508 random() AS r1,
509 random() AS r2,
510 random() AS r3
511 FROM generate_series(1, 25000)
512 ) g
513 JOIN (
514 SELECT
515 route_id,
516 row_number() OVER () AS rn,
517 count(*) OVER () AS total
518 FROM Route
519 ) r
520 ON r.rn = floor(g.r1 * r.total) + 1
521 JOIN (
522 SELECT
523 segment_id,
524 row_number() OVER () AS rn,
525 count(*) OVER () AS total
526 FROM Segment
527 ) s
528 ON s.rn = floor(g.r2 * s.total) + 1
529 JOIN (
530 SELECT
531 station_id,
532 row_number() OVER () AS rn,
533 count(*) OVER () AS total
534 FROM Station
535 ) st
536 ON st.rn = floor(g.r3 * st.total) + 1
537),
538numbered AS (
539 SELECT
540 Routeroute_id,
541 Segmentsegment_id,
542 is_station_stop,
543 Stationstation_id,
544 rand_order,
545 row_number() OVER (
546 PARTITION BY Routeroute_id
547 ORDER BY rand_order
548 ) AS sequence_number
549 FROM base
550),
551final_rows AS (
552 SELECT
553 Routeroute_id,
554 Segmentsegment_id,
555 sequence_number,
556 CASE
557 WHEN is_station_stop = 1 THEN sequence_number
558 ELSE NULL
559 END AS stops_at_segment,
560 is_station_stop,
561 CASE
562 WHEN is_station_stop = 1 THEN Stationstation_id
563 ELSE NULL
564 END AS Stationstation_id,
565 (sequence_number * (5 + floor(random() * 16)::int))::float4 AS distance_from_start,
566 (sequence_number * (4 + floor(random() * 12)::int))::int4 AS estimated_time_offset
567 FROM numbered
568)
569SELECT
570 Routeroute_id,
571 Segmentsegment_id,
572 sequence_number,
573 stops_at_segment,
574 is_station_stop,
575 Stationstation_id,
576 distance_from_start,
577 estimated_time_offset
578FROM final_rows
579ORDER BY random()
580LIMIT 15000
581ON CONFLICT (Routeroute_id, Segmentsegment_id) DO NOTHING;
582
583
584----------Train_stops_at_station Ana-------------------------
585TRUNCATE TABLE train_stops_at_station;
586
587INSERT INTO train_stops_at_station
588(
589 Traintrain_id,
590 Stationstation_id
591)
592WITH train_rows AS (
593 SELECT
594 t.train_id,
595 20 + (abs(mod(t.train_id * 37, 81))) AS stations_needed
596 FROM Train t
597),
598picked AS (
599 SELECT
600 t.train_id,
601 s.station_id
602 FROM train_rows t
603 CROSS JOIN LATERAL (
604 SELECT station_id
605 FROM Station
606 ORDER BY md5(t.train_id::text || '-' || station_id::text)
607 LIMIT t.stations_needed
608 ) s
609)
610SELECT
611 train_id,
612 station_id
613FROM picked
614ORDER BY random()
615ON CONFLICT DO NOTHING;
616
617---------Train Trip_Segment Ana----------------------
618
619TRUNCATE TABLE "Train Trip_Segment";
620
621WITH trip_rows AS (
622 SELECT
623 tt.trip_id,
624 row_number() OVER (ORDER BY tt.trip_id) AS trip_rn,
625 CASE
626 WHEN (row_number() OVER (ORDER BY tt.trip_id) % 10) < 5 THEN 2
627 WHEN (row_number() OVER (ORDER BY tt.trip_id) % 10) < 8 THEN 3
628 ELSE 4
629 END AS segments_needed
630 FROM "Train Trip" tt
631),
632segment_rows AS (
633 SELECT
634 sg.segment_id,
635 row_number() OVER (ORDER BY sg.segment_id) AS seg_rn
636 FROM Segment sg
637),
638seg_cnt AS (
639 SELECT COUNT(*) AS cnt
640 FROM segment_rows
641),
642picked AS (
643 SELECT
644 t.trip_id,
645 gs.seq AS log_sequence_order,
646 1 + ((t.trip_rn * 97 + gs.seq * 37) % c.cnt) AS seg_rn1,
647 1 + ((t.trip_rn * 53 + gs.seq * 71) % c.cnt) AS seg_rn2
648 FROM trip_rows t
649 CROSS JOIN seg_cnt c
650 CROSS JOIN LATERAL generate_series(1, t.segments_needed) AS gs(seq)
651),
652final_rows AS (
653 SELECT DISTINCT ON (p.trip_id, s.segment_id)
654 p.trip_id,
655 s.segment_id,
656 p.log_sequence_order,
657 md5(p.trip_id::text || '-' || p.log_sequence_order::text) AS mix_key
658 FROM picked p
659 JOIN segment_rows s
660 ON s.seg_rn = p.seg_rn1
661 OR s.seg_rn = p.seg_rn2
662)
663INSERT INTO "Train Trip_Segment"
664(
665 "Train Triptrip_id",
666 Segmentsegment_id,
667 log_sequence_order
668)
669SELECT
670 trip_id,
671 segment_id,
672 row_number() OVER (
673 PARTITION BY trip_id
674 ORDER BY mix_key
675 ) AS log_sequence_order
676FROM final_rows
677ORDER BY md5(random()::text)
678ON CONFLICT DO NOTHING;
679
680-------Ticket Ana ---------------
681Truncate table ticket;
682INSERT INTO Ticket
683(
684 seat_number,
685 carriage_number,
686 price,
687 ticket_status,
688 Paymentpayment_id,
689 "Train Triptrip_id",
690 Stationstation_id,
691 Stationstation_id2
692)
693WITH payment_pool AS (
694 SELECT
695 p.payment_id,
696 p.amount,
697 p.transaction_date,
698 row_number() OVER (ORDER BY p.payment_id) AS rn
699 FROM Payment p
700 WHERE p.transaction_date IS NOT NULL
701 AND p.amount > 0
702),
703trip_pool AS (
704 SELECT
705 tt.trip_id,
706 tr.type,
707 row_number() OVER (ORDER BY tt.trip_id) AS rn
708 FROM "Train Trip" tt
709 JOIN Train tr
710 ON tr.train_id = tt.Traintrain_id
711),
712station_pool AS (
713 SELECT
714 s.station_id,
715 row_number() OVER (ORDER BY s.station_id) AS rn
716 FROM Station s
717),
718counts AS (
719 SELECT
720 (SELECT COUNT(*) FROM payment_pool) AS payment_cnt,
721 (SELECT COUNT(*) FROM trip_pool) AS trip_cnt,
722 (SELECT COUNT(*) FROM station_pool) AS station_cnt
723),
724gen AS (
725 SELECT generate_series(1, 12000000) AS g
726),
727picked AS (
728 SELECT
729 g.g,
730 p.payment_id,
731 p.amount,
732 p.transaction_date,
733 t.trip_id,
734 t.type,
735 s1.station_id AS start_station,
736 s2.station_id AS end_station,
737 random() AS r
738 FROM gen g
739 CROSS JOIN counts c
740 JOIN payment_pool p
741 ON p.rn = 1 + ((g.g - 1) % c.payment_cnt)
742 JOIN trip_pool t
743 ON t.rn = 1 + ((g.g * 13 - 1) % c.trip_cnt)
744 JOIN station_pool s1
745 ON s1.rn = 1 + ((g.g * 17 - 1) % c.station_cnt)
746 JOIN station_pool s2
747 ON s2.rn = 1 + ((g.g * 37 - 1) % c.station_cnt)
748 WHERE s1.station_id <> s2.station_id
749),
750calc AS (
751 SELECT
752 g,
753 payment_id,
754 amount,
755 trip_id,
756 start_station,
757 end_station,
758 CASE
759 WHEN type ILIKE 'fast' THEN LEAST(amount, (70 + floor(r * 20))::numeric)
760 WHEN type ILIKE 'express' THEN LEAST(amount, (60 + floor(r * 20))::numeric)
761 WHEN type ILIKE 'intercity' THEN LEAST(amount, (45 + floor(r * 20))::numeric)
762 WHEN type ILIKE 'regional' THEN LEAST(amount, (25 + floor(r * 20))::numeric)
763 ELSE LEAST(amount, (15 + floor(r * 30))::numeric)
764 END::numeric(10,2) AS calc_price
765 FROM picked
766)
767SELECT
768 1 + ((g * 7) % 80) AS seat_number,
769 1 + ((g * 3) % 10) AS carriage_number,
770 calc_price AS price,
771 'PAID' AS ticket_status,
772 payment_id,
773 trip_id,
774 start_station,
775 end_station
776FROM calc;
777
778