AdvancedTopics: olap_fact_reservation.sql

File olap_fact_reservation.sql, 5.5 KB (added by 231123, 4 days ago)

OLAP факт табела за резервации

Line 
1-- FactReservation
2
3
4CREATE TABLE FactReservation (
5 reservation_key BIGSERIAL,
6
7 date_key INTEGER NOT NULL,
8 check_in_date_key INTEGER NOT NULL,
9 check_out_date_key INTEGER NOT NULL,
10 hotel_key INTEGER NOT NULL,
11 room_key INTEGER NOT NULL,
12 pet_key INTEGER NOT NULL,
13 customer_key INTEGER NOT NULL,
14 employee_key INTEGER NOT NULL,
15
16 total_cost NUMERIC(10,2) NOT NULL,
17 nights_stayed INTEGER NOT NULL,
18 num_services INTEGER NOT NULL DEFAULT 0,
19 has_delivery BOOLEAN NOT NULL DEFAULT FALSE,
20 status VARCHAR(20) NOT NULL,
21 payment_method VARCHAR(30),
22 payment_status VARCHAR(20),
23 amount_paid NUMERIC(10,2)
24)
25 PARTITION BY RANGE (date_key);
26
27
28CREATE TABLE FactReservation_2015
29 PARTITION OF FactReservation
30 FOR VALUES FROM (20150101) TO (20160101);
31
32CREATE TABLE FactReservation_2016
33 PARTITION OF FactReservation
34 FOR VALUES FROM (20160101) TO (20170101);
35
36CREATE TABLE FactReservation_2017
37 PARTITION OF FactReservation
38 FOR VALUES FROM (20170101) TO (20180101);
39
40CREATE TABLE FactReservation_2018
41 PARTITION OF FactReservation
42 FOR VALUES FROM (20180101) TO (20190101);
43
44CREATE TABLE FactReservation_2019
45 PARTITION OF FactReservation
46 FOR VALUES FROM (20190101) TO (20200101);
47
48CREATE TABLE FactReservation_2020
49 PARTITION OF FactReservation
50 FOR VALUES FROM (20200101) TO (20210101);
51
52CREATE TABLE FactReservation_2021
53 PARTITION OF FactReservation
54 FOR VALUES FROM (20210101) TO (20220101);
55
56CREATE TABLE FactReservation_2022
57 PARTITION OF FactReservation
58 FOR VALUES FROM (20220101) TO (20230101);
59
60CREATE TABLE FactReservation_2023
61 PARTITION OF FactReservation
62 FOR VALUES FROM (20230101) TO (20240101);
63
64CREATE TABLE FactReservation_2024
65 PARTITION OF FactReservation
66 FOR VALUES FROM (20240101) TO (20250101);
67
68CREATE TABLE FactReservation_2025
69 PARTITION OF FactReservation
70 FOR VALUES FROM (20250101) TO (20260101);
71
72CREATE TABLE FactReservation_2026
73 PARTITION OF FactReservation
74 FOR VALUES FROM (20260101) TO (20270101);
75
76CREATE TABLE FactReservation_2027
77 PARTITION OF FactReservation
78 FOR VALUES FROM (20270101) TO (20280101);
79
80
81-- ETL
82INSERT INTO FactReservation (
83 date_key,
84 check_in_date_key,
85 check_out_date_key,
86 hotel_key,
87 room_key,
88 pet_key,
89 customer_key,
90 employee_key,
91 total_cost,
92 nights_stayed,
93 num_services,
94 has_delivery,
95 status,
96 payment_method,
97 payment_status,
98 amount_paid
99)
100SELECT
101 -- date_key
102 TO_CHAR(r.reservation_date, 'YYYYMMDD')::INTEGER,
103
104 -- check in / check out date keys
105 TO_CHAR(rr.check_in_date, 'YYYYMMDD')::INTEGER,
106 TO_CHAR(rr.check_out_date, 'YYYYMMDD')::INTEGER,
107
108 -- dims
109 h.hotel_key,
110 dm_room.room_key,
111 dp.pet_key,
112 dc.customer_key,
113 de.employee_key,
114
115 r.total_cost,
116 (rr.check_out_date - rr.check_in_date) AS nights_stayed,
117
118 -- num services
119 COALESCE(svc.num_services, 0),
120
121 -- dali ima dostava
122 (del.reservation_id IS NOT NULL),
123
124 -- status i plakjanje
125 rs.name,
126 pay.payment_method,
127 pay.payment_status,
128 pay.amount
129
130FROM Reservation r
131
132-- res status
133 JOIN ReservationStatus rs
134 ON rs.reservation_status_id = r.status_id
135
136-- room i hotel
137 JOIN RoomReservation rr
138 ON rr.reservation_id = r.reservation_id
139 JOIN DimRoom dm_room
140 ON dm_room.room_id = rr.room_id
141 AND dm_room.is_current = TRUE
142 JOIN DimHotel h
143 ON h.hotel_key = dm_room.hotel_key
144
145-- pet
146 JOIN DimPet dp
147 ON dp.pet_id = r.pet_id
148 AND dp.is_current = TRUE
149
150-- klient
151 JOIN Pet pet
152 ON pet.pet_id = r.pet_id
153 JOIN DimCustomer dc
154 ON dc.customer_id = pet.customer_id
155 AND dc.is_current = TRUE
156
157-- emp
158 JOIN DimEmployee de
159 ON de.employee_id = r.employee_id
160 AND de.is_current = TRUE
161
162-- broj na services
163 LEFT JOIN (
164 SELECT reservation_id, COUNT(*) AS num_services
165 FROM ServiceReservation
166 GROUP BY reservation_id
167) svc ON svc.reservation_id = r.reservation_id
168
169-- dali ima dostava
170 LEFT JOIN (
171 SELECT DISTINCT reservation_id
172 FROM PetDelivery
173) del ON del.reservation_id = r.reservation_id
174
175 -- plakjanje
176 LEFT JOIN (
177 SELECT DISTINCT ON (p.reservation_id)
178 p.reservation_id,
179 pm.name AS payment_method,
180 ps.name AS payment_status,
181 p.amount,
182 p.payment_date
183 FROM Payment p
184 JOIN PaymentStatus ps ON ps.payment_status_id = p.status_id
185 JOIN PaymentMethod pm ON pm.payment_method_id = p.payment_method_id
186 WHERE ps.name = 'completed'
187 ORDER BY p.reservation_id, p.payment_date DESC
188) pay ON pay.reservation_id = r.reservation_id;