QueryOptimization: views.sql

File views.sql, 13.5 KB (added by 231105, 10 days ago)
Line 
1-------------------------------------------------------------------------------
2--station_traffic_and_revenue Marija
3
4CREATE VIEW station_traffic_and_revenue AS
5SELECT
6 s.station_id,
7 s.station_name,
8 s.city,
9 COUNT(tk.ticket_id) AS passengers_departed,
10 SUM(tk.price) AS revenue_generated,
11 COUNT(DISTINCT tt.Traintrain_id) AS unique_trains_passed
12FROM Station s
13JOIN Ticket tk ON s.station_id = tk.Stationstation_id
14JOIN "Train Trip" tt ON tk."Train Triptrip_id" = tt.trip_id
15GROUP BY s.station_id, s.station_name, s.city;
16
17select * from station_traffic_and_revenue where station_id=14;
18
19DROP VIEW IF EXISTS station_traffic_and_revenue;
20
21CREATE MATERIALIZED VIEW station_traffic_and_revenue AS
22SELECT
23 s.station_id,
24 s.station_name,
25 s.city,
26 COUNT(tk.ticket_id) AS passengers_departed,
27 SUM(tk.price) AS revenue_generated,
28 COUNT(DISTINCT tt.Traintrain_id) AS unique_trains_passed
29FROM Station s
30JOIN Ticket tk ON s.station_id = tk.Stationstation_id
31JOIN "Train Trip" tt ON tk."Train Triptrip_id" = tt.trip_id
32GROUP BY s.station_id, s.station_name, s.city;
33
34select * from station_traffic_and_revenue where station_id=14;
35
36CREATE INDEX idx_station_traffic_sid ON station_traffic_and_revenue (station_id);
37
38EXPLAIN (ANALYZE, COSTS OFF, TIMING ON, SUMMARY ON)
39SELECT * FROM station_traffic_and_revenue WHERE station_id=14;
40
41----------------------------------------------------------------------
42--view_train_utilization Marija
43
44CREATE VIEW view_train_utilization AS
45SELECT
46 t.train_id,
47 t.train_number,
48 COUNT(tt.trip_id) AS total_trips,
49 AVG(tt.delay_minutes) AS avg_delay_minutes
50FROM Train t
51LEFT JOIN "Train Trip" tt ON t.train_id = tt.Traintrain_id
52GROUP BY t.train_id, t.train_number;
53
54SELECT * FROM view_train_utilization WHERE train_id = 91;
55
56EXPLAIN (ANALYZE, COSTS OFF, TIMING ON, SUMMARY ON)
57SELECT * FROM view_train_utilization WHERE train_id = 91;
58
59----------------------------------------------------------------------
60--view_payment_audit Marija
61
62CREATE VIEW view_payment_audit AS
63SELECT
64 pm.payment_id,
65 p.first_name || ' ' || p.last_name AS passenger_name,
66 pm.amount AS total_paid,
67 SUM(tk.price) AS total_ticket_value,
68 (pm.amount - SUM(tk.price)) AS discrepancy,
69 CASE
70 WHEN pm.amount = SUM(tk.price) THEN 'Balanced'
71 WHEN pm.amount > SUM(tk.price) THEN 'Overpaid'
72 ELSE 'Underpaid'
73 END AS audit_status
74FROM Payment pm
75JOIN Person p ON pm.PassengerPersonEMBG2 = p.EMBG
76JOIN Ticket tk ON pm.payment_id = tk.Paymentpayment_id
77GROUP BY pm.payment_id, p.first_name, p.last_name, pm.amount;
78
79SELECT * FROM view_payment_audit WHERE payment_id = 212;
80
81DROP VIEW IF EXISTS view_payment_audit;
82
83CREATE MATERIALIZED VIEW view_payment_audit AS
84SELECT
85 pm.payment_id,
86 p.first_name || ' ' || p.last_name AS passenger_name,
87 pm.amount AS total_paid,
88 SUM(tk.price) AS total_ticket_value,
89 (pm.amount - SUM(tk.price)) AS discrepancy,
90 CASE
91 WHEN pm.amount = SUM(tk.price) THEN 'Balanced'
92 WHEN pm.amount > SUM(tk.price) THEN 'Overpaid'
93 ELSE 'Underpaid'
94 END AS audit_status
95FROM Payment pm
96JOIN Person p ON pm.PassengerPersonEMBG2 = p.EMBG
97JOIN Ticket tk ON pm.payment_id = tk.Paymentpayment_id
98GROUP BY pm.payment_id, p.first_name, p.last_name, pm.amount;
99
100SELECT * FROM view_payment_audit WHERE payment_id = 212;
101
102CREATE INDEX idx_audit_payment_id ON view_payment_audit (payment_id);
103
104EXPLAIN (ANALYZE, COSTS OFF, TIMING ON, SUMMARY ON)
105SELECT * FROM view_payment_audit WHERE payment_id = 212;
106----------------------------------------------------------------------
107--view_route_passenger_summary Marija
108
109CREATE VIEW view_route_passenger_summary AS
110SELECT
111 r.route_id,
112 r.route_name,
113 COUNT(tk.ticket_id) AS total_tickets_sold,
114 SUM(tk.price) AS total_revenue
115FROM Route r
116LEFT JOIN "Train Trip" tt ON r.route_id = tt.Routeroute_id
117LEFT JOIN Ticket tk ON tt.trip_id = tk."Train Triptrip_id"
118GROUP BY r.route_id, r.route_name;
119
120SELECT * FROM view_route_passenger_summary WHERE route_id = 517;
121
122DROP VIEW IF EXISTS view_route_passenger_summary;
123
124CREATE MATERIALIZED VIEW view_route_passenger_summary AS
125SELECT
126 r.route_id,
127 r.route_name,
128 COUNT(tk.ticket_id) AS total_tickets_sold,
129 SUM(tk.price) AS total_revenue
130FROM Route r
131LEFT JOIN "Train Trip" tt ON r.route_id = tt.Routeroute_id
132LEFT JOIN Ticket tk ON tt.trip_id = tk."Train Triptrip_id"
133GROUP BY r.route_id, r.route_name;
134
135SELECT * FROM view_route_passenger_summary WHERE route_id = 517;
136
137CREATE INDEX idx_traintrip_route_id ON "Train Trip" (Routeroute_id);
138CREATE INDEX idx_ticket_trip_id_1 ON Ticket ("Train Triptrip_id");
139
140EXPLAIN (ANALYZE, COSTS OFF, TIMING ON, SUMMARY ON)
141SELECT * FROM view_route_passenger_summary WHERE route_id = 517;
142---------------------------------------------------------------------------
143--------------functionalView1 Nina--------------
144
145DROP VIEW IF EXISTS view_conductor_list CASCADE;
146
147CREATE VIEW view_conductor_list AS
148SELECT
149 tt.trip_id,
150 t.train_number,
151 tk.ticket_id,
152 tk.seat_number,
153 tk.carriage_number,
154 p.first_name || ' ' || p.last_name AS passenger,
155 s1.station_name AS departure_station,
156 s2.station_name AS arrival_station,
157 tt.departure_time
158FROM Ticket tk
159JOIN "Train Trip" tt ON tk."Train Triptrip_id" = tt.trip_id
160JOIN Train t ON tt.Traintrain_id = t.train_id
161JOIN Payment pay ON tk.Paymentpayment_id = pay.payment_id
162JOIN Passenger pass ON pay.Passengerpassenger_id = pass.passenger_id
163 AND pay.PassengerPersonEMBG2 = pass.PersonEMBG
164JOIN Person p ON pass.PersonEMBG = p.EMBG
165JOIN Station s1 ON tk.Stationstation_id = s1.station_id
166JOIN Station s2 ON tk.Stationstation_id2 = s2.station_id;
167
168select * from view_conductor_list where trip_id=345895;
169
170CREATE INDEX idx_ticket_trip_id ON Ticket ("Train Triptrip_id");
171
172EXPLAIN (ANALYZE, COSTS OFF, TIMING ON, SUMMARY ON)
173SELECT * FROM view_conductor_list WHERE trip_id = 345895;
174
175SELECT * FROM view_conductor_list LIMIT 10;
176----------------------------------------------------------------
177
178----------functionalView2 Nina----------------
179
180CREATE VIEW view_user_ticket_history AS
181SELECT
182 pass.passenger_id,
183 p.first_name || ' ' || p.last_name AS passenger_name,
184 tk.ticket_id,
185 tt.departure_time,
186 r.route_name,
187 tk.ticket_status,
188 CASE
189 WHEN tt.departure_time >= CURRENT_DATE THEN 'Upcoming'
190 ELSE 'Past'
191 END AS travel_period
192FROM Ticket tk
193JOIN "Train Trip" tt ON tk."Train Triptrip_id" = tt.trip_id
194JOIN Route r ON tt.Routeroute_id = r.route_id
195JOIN Payment pay ON tk.Paymentpayment_id = pay.payment_id
196JOIN Passenger pass ON pay.Passengerpassenger_id = pass.passenger_id
197JOIN Person p ON pass.PersonEMBG = p.EMBG;
198
199
200select * from view_user_ticket_history where passenger_id=689371;
201
202CREATE INDEX idx_ticket_payment_id ON Ticket (Paymentpayment_id);
203CREATE INDEX idx_payment_passenger_id ON Payment (Passengerpassenger_id);
204
205
206EXPLAIN (ANALYZE, COSTS OFF, TIMING ON, SUMMARY ON)
207select * from view_user_ticket_history where passenger_id=689371;
208
209-------------------------------------------------------------------------
210------Functional view 3 Nina----
211
212CREATE VIEW view_station_departures AS
213SELECT s.station_id, s.station_name,tt.trip_id,r.route_name, tt.departure_time, tt.trip_status, tt.delay_minutes
214FROM "Train Trip" tt
215JOIN Route r ON tt.Routeroute_id = r.route_id
216JOIN Platform pl ON tt.PlatformStationstation_id = pl.Stationstation_id AND tt.Platformplatform_id = pl.platform_id
217JOIN Station s ON pl.Stationstation_id = s.station_id
218WHERE tt.departure_time >= CURRENT_DATE
219ORDER BY tt.departure_time ASC;
220
221select * from view_station_departures where trip_id=47138;
222
223EXPLAIN (ANALYZE, COSTS OFF, TIMING ON, SUMMARY ON)
224select * from view_user_ticket_history where passenger_id=689371;
225
226---------------------------------------------------------------------------
227------Functional view 4 Nina----------------
228
229CREATE VIEW view_station_arrivals AS
230SELECT s.station_id, s.station_name, tt.trip_id,r.route_name, tt.arrival_time, tt.trip_status, tt.delay_minutes
231FROM "Train Trip" tt
232JOIN Route r ON tt.Routeroute_id = r.route_id
233JOIN Platform pl ON tt.PlatformStationstation_id = pl.Stationstation_id AND tt.Platformplatform_id = pl.platform_id
234JOIN Station s ON pl.Stationstation_id = s.station_id
235WHERE tt.arrival_time >= CURRENT_DATE
236ORDER BY tt.arrival_time ASC;
237
238select * from view_station_arrivals where trip_id=146474;
239
240EXPLAIN (ANALYZE, COSTS OFF, TIMING ON, SUMMARY ON)
241select * from view_station_arrivals where trip_id=146474;
242
243-----------------------------------------------------------------------
244--view_route_infrastructure_stats Nina
245
246CREATE VIEW view_route_infrastructure_stats AS
247SELECT
248 r.route_name,
249 COUNT(rs.Segmentsegment_id) AS total_segments,
250 SUM(seg.length_km) AS total_route_length_km,
251 MIN(seg.max_speed) AS bottleneck_speed,
252 AVG(seg.max_speed) AS average_speed_limit
253FROM Route r
254JOIN Route_Segment rs ON r.route_id = rs.Routeroute_id
255JOIN Segment seg ON rs.Segmentsegment_id = seg.segment_id
256GROUP BY r.route_id, r.route_name;
257
258SELECT
259 route_name,
260 total_segments,
261 total_route_length_km
262FROM view_route_infrastructure_stats
263ORDER BY total_route_length_km DESC
264LIMIT 10;
265
266select * from view_route_infrastructure_stats where route_name='Venice - Bari';
267
268---------------------------------------------------
269--view_trip_performance Ana
270
271CREATE VIEW view_trip_performance AS
272SELECT
273 tt.trip_id,
274 r.route_name,
275 t.train_number,
276 p.first_name || ' ' || p.last_name AS driver_name,
277 tt.departure_time,
278 tt.arrival_time,
279 tt.delay_minutes,
280 CASE
281 WHEN tt.delay_minutes = 0 THEN 'On Time'
282 WHEN tt.delay_minutes <= 15 THEN 'Slight Delay'
283 ELSE 'Significant Delay'
284 END AS delay_status
285FROM "Train Trip" tt
286JOIN Route r ON tt.Routeroute_id = r.route_id
287JOIN Train t ON tt.Traintrain_id = t.train_id
288JOIN Employee e ON tt.EmployeePersonEMBG2 = e.PersonEMBG AND tt.Employeeemployee_id = e.employee_id
289JOIN Person p ON e.PersonEMBG = p.EMBG;
290
291SELECT trip_id,
292 delay_minutes,
293 delay_status
294FROM view_trip_performance
295WHERE delay_minutes > 0
296LIMIT 10;
297
298SELECT
299 v.trip_id,
300 v.route_name,
301 v.delay_status,
302 COUNT(tk.ticket_id) AS total_passengers
303FROM view_trip_performance v
304LEFT JOIN Ticket tk ON v.trip_id = tk."Train Triptrip_id"
305GROUP BY v.trip_id, v.route_name, v.delay_status
306ORDER BY total_passengers DESC
307limit 10;
308
309select * from view_trip_performance where trip_id=6789;
310EXPLAIN (ANALYZE , COSTS OFF , TIMING On, SUMMARY ON)
311select * from view_trip_performance where trip_id=6789;
312
313-----------------------------------------------------------------
314--active_delays Ana
315
316CREATE VIEW active_delays AS
317SELECT
318 tt.trip_id,
319 r.route_name,
320 t.train_number,
321 tt.departure_time,
322 tt.delay_minutes,
323 s.station_name AS current_stop
324FROM "Train Trip" tt
325JOIN Route r ON tt.Routeroute_id = r.route_id
326JOIN Train t ON tt.Traintrain_id = t.train_id
327JOIN Station s ON tt.PlatformStationstation_id = s.station_id
328WHERE tt.delay_minutes > 0 AND tt.trip_status != 'Completed';
329
330select * from active_delays where trip_id=30275;
331EXPLAIN (ANALYZE , COSTS OFF , TIMING On, SUMMARY ON)
332select * from active_delays where trip_id=30275;
333
334----------------------------------------------------------
335--train_maintenance_stats Ana
336
337CREATE VIEW train_maintenance_stats AS
338SELECT
339 t.train_id,
340 t.train_number,
341 COUNT(DISTINCT tum.maintenancemaintenance_id) AS total_services,
342 COUNT(DISTINCT epm.employeeemployee_id) AS total_technicians_involved
343FROM Train t
344LEFT JOIN train_undergoes_maintenance tum ON t.train_id = tum.traintrain_id
345LEFT JOIN employee_performs_maintenance epm ON tum.maintenancemaintenance_id = epm.maintenancemaintenance_id
346GROUP BY t.train_id, t.train_number;
347
348select * from train_maintenance_stats where train_id=940;
349CREATE INDEX ind_train_maintenance
350ON employee_performs_maintenance(maintenancemaintenance_id);
351EXPLAIN (ANALYZE , COSTS OFF , TIMING On, SUMMARY ON)
352select * from train_maintenance_stats where train_id=940;
353-------------------------------------------------------------
354--route_trip_stats Ana
355
356CREATE VIEW route_trip_stats AS
357SELECT
358 r.route_id,
359 r.route_name,
360 COUNT(tt.trip_id) AS total_trips,
361 AVG(tt.delay_minutes) AS avg_delay
362FROM Route r
363LEFT JOIN "Train Trip" tt ON tt.Routeroute_id = r.route_id
364GROUP BY r.route_id, r.route_name;
365
366select * from route_trip_stats where route_id=489;
367EXPLAIN (ANALYZE , COSTS OFF , TIMING On, SUMMARY ON)
368select * from route_trip_stats where route_id=489;
369----------------------------------------------------------------------
370CREATE OR REPLACE VIEW vw_free_seats_per_trip AS
371SELECT
372 tt.trip_id,
373 COALESCE(t.capacity, 0) AS total_capacity,
374 COUNT(tk.ticket_id) AS sold_tickets,
375 (COALESCE(t.capacity, 0) - COUNT(tk.ticket_id)) AS free_seats
376FROM "Train Trip" tt
377JOIN Train t
378 ON tt.Traintrain_id = t.train_id
379LEFT JOIN Ticket tk
380 ON tt.trip_id = tk."Train Triptrip_id"
381GROUP BY tt.trip_id, t.capacity;
382
383SELECT * FROM vw_free_seats_per_trip;
384
385SELECT free_seats FROM vw_free_seats_per_trip WHERE trip_id = 155;
386
387
388EXPLAIN (ANALYZE, COSTS OFF, TIMING ON, SUMMARY ON)
389SELECT free_seats FROM vw_free_seats_per_trip WHERE trip_id = 155;
390
391-----------------------------------------------------------
392INDEX DROP
393
394drop index idx_station_traffic_sid;
395drop index idx_traintrip_route_id;
396drop index idx_ticket_trip_id_1;
397drop index idx_audit_payment_id;