-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathviews.sql
199 lines (182 loc) · 5.79 KB
/
views.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
CREATE TABLE IF NOT EXISTS email_details
(
email_address varchar(100) NOT NULL PRIMARY KEY
);
CREATE TABLE IF NOT EXISTS property_floorplan
(
property_id integer NOT NULL PRIMARY KEY,
floorplan_url varchar(1000),
area_sqft double precision,
area_sqm double precision
);
CREATE TABLE IF NOT EXISTS property_summary
(
property_id integer NOT NULL PRIMARY KEY,
summary varchar(10000),
garden varchar(50)
);
CREATE TABLE IF NOT EXISTS property_location_excluded
(
property_id integer NOT NULL PRIMARY KEY,
excluded boolean
);
CREATE TABLE IF NOT EXISTS property_data
(
property_id integer NOT NULL,
property_validfrom timestamp NOT NULL,
property_validto timestamp NOT NULL,
bedrooms integer,
bathrooms integer,
area double precision,
summary varchar NOT NULL,
address varchar NOT NULL,
property_subtype varchar,
property_description varchar NOT NULL,
premium_listing boolean NOT NULL,
price_amount double precision NOT NULL,
price_frequency varchar NOT NULL,
price_qualifier varchar,
lettings_agent varchar NOT NULL,
lettings_agent_branch varchar NOT NULL,
development boolean NOT NULL,
commercial boolean NOT NULL,
enhanced_listing boolean NOT NULL,
students boolean NOT NULL,
auction boolean NOT NULL,
first_visible timestamp,
last_update timestamp,
last_displayed_update timestamp,
PRIMARY KEY (property_id, property_validfrom)
);
CREATE TABLE IF NOT EXISTS property_images
(
property_id integer NOT NULL,
image_url varchar NOT NULL,
image_caption varchar,
PRIMARY KEY (property_id, image_url)
);
CREATE TABLE IF NOT EXISTS property_location
(
property_id serial
PRIMARY KEY,
property_asatdt timestamp,
property_channel varchar NOT NULL,
property_longitude double precision NOT NULL,
property_latitude double precision NOT NULL
);
CREATE TABLE IF NOT EXISTS review_dates
(
reviewed_date timestamp NOT NULL
PRIMARY KEY,
email_id integer,
str_date varchar
);
CREATE TABLE IF NOT EXISTS reviewed_properties
(
property_id serial
PRIMARY KEY,
reviewed_date timestamp NOT NULL,
emailed boolean NOT NULL
);
CREATE TABLE IF NOT EXISTS travel_time_precise
(
property_id serial
PRIMARY KEY,
travel_time integer
);
DROP VIEW IF EXISTS properties_review;
DROP VIEW IF EXISTS alert_properties;
DROP VIEW IF EXISTS properties_enhanced;
DROP VIEW IF EXISTS properties_current;
DROP VIEW IF EXISTS start_date;
CREATE VIEW start_date AS
SELECT
MAX(property_validfrom) AS model_date
FROM
property_data;
CREATE VIEW properties_current AS
SELECT
CURRENT_TIMESTAMP AS time,
pd.*,
pl.property_channel,
pl.property_longitude AS longitude,
pl.property_latitude AS latitude,
TO_CHAR(GREATEST(COALESCE(first_visible, '1970-01-01'::timestamp),
COALESCE(last_displayed_update, '1970-01-01'::timestamp)),
'YYYY-MM-DD') AS last_rightmove_update,
ROUND(EXTRACT(EPOCH FROM sd.model_date) - EXTRACT(EPOCH FROM pd.first_visible) / 86400) AS days_old
FROM
property_data AS pd
LEFT JOIN property_location AS pl USING (property_id)
FULL JOIN start_date AS sd ON 1 = 1
WHERE
CURRENT_TIMESTAMP BETWEEN pd.property_validfrom AND pd.property_validto;
CREATE VIEW properties_enhanced AS
SELECT
ap.property_id,
ap.bedrooms,
ap.bathrooms,
COALESCE(ap.area, pf.area_sqft) AS area,
ps.garden,
ap.summary,
ap.address,
ap.property_subtype,
ap.property_description,
ap.price_amount,
ap.lettings_agent,
ap.lettings_agent_branch,
ap.last_rightmove_update AS last_update,
ap.longitude,
ap.latitude,
r.emailed,
r.reviewed_date,
CASE
WHEN r.reviewed_date = (SELECT MAX(reviewed_date) FROM reviewed_properties) THEN 1
ELSE 0 END AS latest_reviewed,
CASE WHEN ap.property_id = r.property_id THEN 1 ELSE 0 END AS property_reviewed,
CASE WHEN ap.property_id = tp.property_id THEN 1 ELSE 0 END AS travel_reviewed,
ple.excluded AS location_excluded,
tp.travel_time,
rp.email_id AS review_id,
(SELECT STRING_AGG(DISTINCT image_url, ',') FROM property_images pi WHERE pi.property_id = ap.property_id) AS images
FROM
properties_current ap
LEFT JOIN travel_time_precise tp USING (property_id)
LEFT JOIN property_location_excluded ple USING (property_id)
LEFT JOIN reviewed_properties r USING (property_id)
LEFT JOIN review_dates rp USING (reviewed_date)
LEFT JOIN property_floorplan pf USING (property_id)
LEFT JOIN property_summary ps USING (property_id)
WHERE
NOT ap.development
AND NOT ap.commercial
AND NOT ap.auction
AND ap.last_rightmove_update > TO_CHAR(CURRENT_DATE - INTERVAL '30 days', 'YYYY-MM-DD')
;
CREATE VIEW alert_properties AS
SELECT
*
FROM
properties_enhanced
WHERE
price_amount BETWEEN 550000 AND 850000
AND bedrooms >= 2
AND (area > 700 OR area IS NULL)
AND (NOT location_excluded OR location_excluded IS NULL)
AND (travel_time <= 40 OR travel_time IS NULL)
AND (
LOWER(summary) LIKE '%garden%'
OR LOWER(summary) LIKE '%patio%'
OR LOWER(summary) LIKE '%terrace%'
OR LOWER(summary) LIKE '%yard%'
)
AND (garden IN ('private', 'unknown') OR garden IS NULL)
;
CREATE VIEW properties_review AS
SELECT
*
FROM
alert_properties
ORDER BY
review_id DESC
;