@golemio/waze-tt 1.1.0 → 1.1.1-dev.773639991

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,362 @@
1
+ CREATE OR REPLACE PROCEDURE analytic.update_waze()
2
+ LANGUAGE plpgsql
3
+ AS $procedure$
4
+
5
+ declare
6
+ lastupdatetimestamp timestamptz;
7
+ lastupdateunix bigint;
8
+ begin
9
+ select
10
+ case
11
+ when start_day is not null
12
+ then start_day
13
+ else '2021-01-01'
14
+ end as start_day_from into lastupdatetimestamp
15
+ from (select max(date)-interval '1 days' start_day from analytic.waze_route_travel_times_agg) wazemax;
16
+
17
+ lastupdateunix := extract ('epoch' from lastupdatetimestamp) * 1000;
18
+ -- inserting data is incremental, since the last timestamp already in the table
19
+ insert into analytic.waze_route_travel_times_agg
20
+ SELECT ts.route_id,
21
+ ts.year,
22
+ ts.month,
23
+ ts.day,
24
+ ts.dow,
25
+ ts.hour,
26
+ ts.quarter,
27
+ ts.hour + (ts.quarter::numeric / 60::numeric)::double precision AS hour_quarter,
28
+ ((((((((ts.year || '-'::text) || ts.month) || '-'::text) || ts.day) || ' '::text) || ts.hour) || ':'::text) || ts.quarter)::timestamp without time zone AS date,
29
+ avg(ts.travel_time)::integer AS travel_time
30
+ FROM ( SELECT raw.route_id,
31
+ raw.update_time,
32
+ raw.travel_time,
33
+ date_part('year'::text, raw.update_time) AS year,
34
+ date_part('month'::text, raw.update_time) AS month,
35
+ date_part('day'::text, raw.update_time) AS day,
36
+ date_part('dow'::text, raw.update_time) AS dow,
37
+ date_part('hour'::text, raw.update_time) AS hour,
38
+ date_part('minute'::text, raw.update_time) AS minute,
39
+ date_part('minute'::text, raw.update_time)::integer / 15 * 15 AS quarter
40
+ FROM ( SELECT wazett_route_lives.route_id,
41
+ timezone('Europe/Prague'::text, to_timestamp((wazett_route_lives.update_time / 1000)::double precision)::timestamp without time zone) AS update_time,
42
+ wazett_route_lives."time" AS travel_time
43
+ FROM wazett_route_lives
44
+ JOIN analytic.waze_dashboard_route_name wdrn ON wdrn.route_id = wazett_route_lives.route_id
45
+ where wazett_route_lives.update_time > lastupdateunix -- this is the time condition for the increment
46
+ ) raw
47
+ ) ts
48
+ WHERE ts.year > 2000::double precision
49
+ GROUP BY ts.route_id, ts.year, ts.month, ts.day, ts.dow, ts.hour, ts.quarter
50
+ ON CONFLICT (route_id, year, month, day, dow, hour, quarter, hour_quarter)
51
+ DO update
52
+ SET
53
+ date = EXCLUDED.date,
54
+ travel_time = EXCLUDED.travel_time
55
+ ;
56
+ end;
57
+ $procedure$
58
+ ;
59
+
60
+
61
+ CREATE OR REPLACE PROCEDURE analytic.update_mala_strana()
62
+ LANGUAGE plpgsql
63
+ AS $procedure$
64
+ declare
65
+ lastupdatetimestamp timestamptz;
66
+ lastupdateunix bigint;
67
+ begin
68
+ begin
69
+ select
70
+ case
71
+ when start_day is not null
72
+ then start_day
73
+ else '2022-01-01'
74
+ end as start_day_from into lastupdatetimestamp
75
+ from (select max(datum)-interval '1 days' start_day from analytic.mala_strana_route_hour_core) barandemax;
76
+
77
+ lastupdateunix := extract ('epoch' from lastupdatetimestamp) * 1000;
78
+
79
+ -- dopoctu hodinovou agregaci (podobné v_mala_strana_route_hour_core) POT5EBUJEME TAKTO?
80
+ insert into analytic.mala_strana_route_hour_core
81
+ SELECT
82
+ wdrn.name,
83
+ rl.ts::date AS datum,
84
+ date_part('hour'::text, rl.ts) AS hodina,
85
+ (to_char(date_part('hour'::text, rl.ts), '09'::text) || ' -'::text) || to_char(date_part('hour'::text, rl.ts) + 1::double precision, '09'::text) AS cas_interval,
86
+ avg_time,
87
+ avg_speed
88
+ FROM (
89
+ select
90
+ route_id
91
+ -- timezone('Europe/Prague'::text, to_timestamp((update_time / 1000)::double precision)::timestamp without time zone)
92
+ ,date_trunc('hour', to_timestamp((update_time / 1000))::timestamp) as ts
93
+ ,round(avg(time), 2) AS avg_time
94
+ ,round(avg(rl.length * 1000 / (nullif(rl."time", 0) * 360)), 2) AS avg_speed
95
+ from wazett.wazett_route_lives rl
96
+ where
97
+ -- route_id = 22706 and
98
+ rl.update_time > lastupdateunix and
99
+ rl.length > 0
100
+ group by 1,2) rl
101
+ JOIN analytic.waze_dashboard_route_name wdrn ON wdrn.route_id = rl.route_id
102
+ ON CONFLICT (name,datum,hodina,cas_interval)
103
+ DO update
104
+ SET avg_time = EXCLUDED.avg_time,
105
+ avg_speed = EXCLUDED.avg_speed
106
+ ;
107
+
108
+ insert into analytic.mala_strana_data_all
109
+ WITH
110
+ v_barrande_route_hour as (
111
+ SELECT p.name,
112
+ p.datum,
113
+ p.hodina,
114
+ p.cas_interval,
115
+ p.avg_time,
116
+ p.avg_speed,
117
+ n.avg_time AS normal_avg_time,
118
+ n.avg_speed AS normal_avg_speed
119
+ FROM analytic.mala_strana_route_hour_core p
120
+ LEFT JOIN analytic.mv_mala_strana_normal n ON n.name = p.name AND p.hodina = n.hodina
121
+ where datum > lastupdatetimestamp
122
+ ),
123
+ -- konec v_barrande_route_hour
124
+ v_barrande_union_time_interval as (
125
+ WITH hodiny AS (
126
+ SELECT brh.name,
127
+ brh.datum,
128
+ brh.hodina,
129
+ brh.cas_interval,
130
+ brh.avg_time,
131
+ brh.avg_speed,
132
+ brh.normal_avg_time,
133
+ brh.normal_avg_speed
134
+ FROM v_barrande_route_hour brh
135
+ WHERE brh.datum < CURRENT_DATE OR brh.hodina < date_part('hour'::text, now())
136
+ ), den AS (
137
+ SELECT hodiny.name,
138
+ hodiny.datum,
139
+ '0 - 24h'::text AS cas_interval,
140
+ round(avg(hodiny.avg_time), 2) AS avg_time,
141
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
142
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
143
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
144
+ FROM hodiny
145
+ WHERE hodiny.datum < CURRENT_DATE
146
+ GROUP BY hodiny.name, hodiny.datum
147
+ ), h15_18 AS (
148
+ SELECT hodiny.name,
149
+ hodiny.datum,
150
+ '15 -18'::text AS cas_interval,
151
+ round(avg(hodiny.avg_time), 2) AS avg_time,
152
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
153
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
154
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
155
+ FROM hodiny
156
+ WHERE hodiny.hodina >= 15::double precision AND hodiny.hodina <= 17::double precision AND (hodiny.datum < CURRENT_DATE OR hodiny.hodina > 17::double precision)
157
+ GROUP BY hodiny.name, hodiny.datum
158
+ ), h22_6 AS (
159
+ SELECT hodiny.name,
160
+ hodiny.datum,
161
+ '22 - 06'::text AS cas_interval,
162
+ round(avg(hodiny.avg_time), 2) AS avg_time,
163
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
164
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
165
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
166
+ FROM hodiny
167
+ WHERE NOT (hodiny.hodina >= 6::double precision AND hodiny.hodina <= 21::double precision) AND hodiny.datum < CURRENT_DATE
168
+ GROUP BY hodiny.name, hodiny.datum
169
+ ), h6_22 AS (
170
+ SELECT hodiny.name,
171
+ hodiny.datum,
172
+ '06 - 22'::text AS cas_interval,
173
+ round(avg(hodiny.avg_time), 2) AS avg_time,
174
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
175
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
176
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
177
+ FROM hodiny
178
+ WHERE hodiny.hodina >= 6::double precision AND hodiny.hodina <= 21::double precision AND (hodiny.datum < CURRENT_DATE OR hodiny.hodina > 21::double precision)
179
+ GROUP BY hodiny.name, hodiny.datum
180
+ ), h7_10 AS (
181
+ SELECT hodiny.name,
182
+ hodiny.datum,
183
+ '07 - 10'::text AS cas_interval,
184
+ round(avg(hodiny.avg_time), 2) AS avg_time,
185
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
186
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
187
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
188
+ FROM hodiny
189
+ WHERE hodiny.hodina >= 7::double precision AND hodiny.hodina <= 9::double precision AND (hodiny.datum < CURRENT_DATE OR hodiny.hodina > 10::double precision)
190
+ GROUP BY hodiny.name, hodiny.datum
191
+ ), h7_11_15_19 AS (
192
+ SELECT hodiny.name,
193
+ hodiny.datum,
194
+ '07 - 11, 15 - 19'::text AS cas_interval,
195
+ round(avg(hodiny.avg_time), 2) AS avg_time,
196
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
197
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
198
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
199
+ FROM hodiny
200
+ WHERE (hodiny.hodina >= 7::double precision AND hodiny.hodina <= 10::double precision OR hodiny.hodina >= 15::double precision AND hodiny.hodina <= 18::double precision) AND (hodiny.datum < CURRENT_DATE OR hodiny.hodina > 18::double precision)
201
+ GROUP BY hodiny.name, hodiny.datum
202
+ )
203
+ SELECT hodiny.name,
204
+ hodiny.datum,
205
+ hodiny.cas_interval,
206
+ hodiny.avg_time,
207
+ hodiny.avg_speed,
208
+ hodiny.normal_avg_time,
209
+ hodiny.normal_avg_speed
210
+ FROM hodiny
211
+ UNION ALL
212
+ SELECT den.name,
213
+ den.datum,
214
+ den.cas_interval,
215
+ den.avg_time,
216
+ den.avg_speed,
217
+ den.normal_avg_time,
218
+ den.normal_avg_speed
219
+ FROM den
220
+ UNION ALL
221
+ SELECT h15_18.name,
222
+ h15_18.datum,
223
+ h15_18.cas_interval,
224
+ h15_18.avg_time,
225
+ h15_18.avg_speed,
226
+ h15_18.normal_avg_time,
227
+ h15_18.normal_avg_speed
228
+ FROM h15_18
229
+ UNION ALL
230
+ SELECT h22_6.name,
231
+ h22_6.datum,
232
+ h22_6.cas_interval,
233
+ h22_6.avg_time,
234
+ h22_6.avg_speed,
235
+ h22_6.normal_avg_time,
236
+ h22_6.normal_avg_speed
237
+ FROM h22_6
238
+ UNION ALL
239
+ SELECT h6_22.name,
240
+ h6_22.datum,
241
+ h6_22.cas_interval,
242
+ h6_22.avg_time,
243
+ h6_22.avg_speed,
244
+ h6_22.normal_avg_time,
245
+ h6_22.normal_avg_speed
246
+ FROM h6_22
247
+ UNION ALL
248
+ SELECT h7_10.name,
249
+ h7_10.datum,
250
+ h7_10.cas_interval,
251
+ h7_10.avg_time,
252
+ h7_10.avg_speed,
253
+ h7_10.normal_avg_time,
254
+ h7_10.normal_avg_speed
255
+ FROM h7_10
256
+ UNION ALL
257
+ SELECT h7_11_15_19.name,
258
+ h7_11_15_19.datum,
259
+ h7_11_15_19.cas_interval,
260
+ h7_11_15_19.avg_time,
261
+ h7_11_15_19.avg_speed,
262
+ h7_11_15_19.normal_avg_time,
263
+ h7_11_15_19.normal_avg_speed
264
+ FROM h7_11_15_19
265
+ ),
266
+ -----------------------
267
+ data1 AS (
268
+ SELECT
269
+ trasy.name,
270
+ trasy.name_trasa,
271
+ trasy.name_usek,
272
+ CASE
273
+ WHEN trasy.is_opacny_smer THEN 'Zpět'::text
274
+ ELSE 'Tam'::text
275
+ END AS smer,
276
+ vbu.datum,
277
+ vbu.cas_interval,
278
+ vbu.avg_time,
279
+ vbu.avg_speed,
280
+ vbu.normal_avg_time,
281
+ vbu.normal_avg_speed
282
+ FROM v_barrande_union_time_interval vbu
283
+ JOIN pavelp.v_mala_strana_route trasy ON trasy.name = vbu.name
284
+ ),
285
+ data2 AS (
286
+ SELECT
287
+ data1.name_trasa,
288
+ data1.name_usek,
289
+ 'Oba'::text AS smer,
290
+ data1.datum,
291
+ data1.cas_interval,
292
+ sum(data1.avg_time) AS avg_time,
293
+ avg(data1.avg_speed) AS avg_speed,
294
+ sum(data1.normal_avg_time) AS normal_avg_time,
295
+ avg(data1.normal_avg_speed) AS normal_avg_speed
296
+ FROM data1
297
+ GROUP BY data1.name_trasa, data1.name_usek, 'Oba'::text, data1.datum, data1.cas_interval
298
+ )
299
+ SELECT data1.name,
300
+ data1.name_trasa,
301
+ data1.name_usek,
302
+ data1.smer,
303
+ data1.datum,
304
+ data1.cas_interval,
305
+ data1.avg_time,
306
+ data1.avg_speed,
307
+ data1.normal_avg_time,
308
+ data1.normal_avg_speed
309
+ FROM data1
310
+ UNION
311
+ SELECT vbt.name,
312
+ data2.name_trasa,
313
+ data2.name_usek,
314
+ data2.smer,
315
+ data2.datum,
316
+ data2.cas_interval,
317
+ data2.avg_time,
318
+ data2.avg_speed,
319
+ data2.normal_avg_time,
320
+ data2.normal_avg_speed
321
+ FROM data2
322
+ JOIN analytic.v_mala_strana_route vbt ON vbt.name_trasa = data2.name_trasa AND vbt.name_usek = data2.name_usek AND NOT vbt.is_opacny_smer
323
+ on conflict (name,name_trasa,name_usek,smer,datum,cas_interval)
324
+ do update
325
+ SET avg_time = EXCLUDED.avg_time,
326
+ avg_speed = EXCLUDED.avg_speed,
327
+ normal_avg_time = EXCLUDED.normal_avg_time,
328
+ normal_avg_speed = EXCLUDED.normal_avg_speed;
329
+ end;
330
+ end;
331
+ $procedure$
332
+ ;
333
+
334
+ -- analytic.mv_mala_strana_normal source
335
+ DROP MATERIALIZED VIEW analytic.mv_mala_strana_normal;
336
+ CREATE MATERIALIZED VIEW analytic.mv_mala_strana_normal
337
+ TABLESPACE pg_default
338
+ AS SELECT vtbh.name,
339
+ vtbh.hodina,
340
+ round(avg(vtbh.avg_time), 2) AS avg_time,
341
+ round(avg(vtbh.avg_speed)) AS avg_speed
342
+ FROM ( SELECT wdrn.name,
343
+ CASE
344
+ WHEN wdrn.idx < 38 THEN 'group1'::text
345
+ ELSE 'group2'::text
346
+ END AS skupina,
347
+ rl.ts::date AS datum,
348
+ date_part('hour'::text, rl.ts) AS hodina,
349
+ (to_char(date_part('hour'::text, rl.ts), '09'::text) || ' -'::text) || to_char(date_part('hour'::text, rl.ts) + 1::double precision, '09'::text) AS cas_interval,
350
+ rl.avg_time,
351
+ rl.avg_speed
352
+ FROM ( SELECT rl_1.route_id,
353
+ date_trunc('hour'::text, to_timestamp((rl_1.update_time / 1000)::double precision)) AS ts,
354
+ round(avg(rl_1."time"), 2) AS avg_time,
355
+ round(avg(rl_1.length * 1000 / (NULLIF(rl_1."time", 0) * 360)), 2) AS avg_speed
356
+ FROM wazett.wazett_route_lives rl_1
357
+ WHERE rl_1.update_time >= '1665360000000'::bigint
358
+ GROUP BY rl_1.route_id, (date_trunc('hour'::text, to_timestamp((rl_1.update_time / 1000)::double precision)))) rl
359
+ JOIN analytic.waze_dashboard_route_name wdrn ON wdrn.route_id = rl.route_id) vtbh
360
+ WHERE vtbh.skupina = 'group1'::text AND vtbh.datum >= '2022-10-10'::date AND vtbh.datum <= '2022-10-25'::date AND (date_part('dow'::text, vtbh.datum) = ANY (ARRAY[2::double precision, 3::double precision, 4::double precision])) OR vtbh.skupina = 'group1'::text AND vtbh.datum >= '2023-01-09'::date AND vtbh.datum <= '2023-01-29'::date AND (date_part('dow'::text, vtbh.datum) = ANY (ARRAY[2::double precision, 3::double precision, 4::double precision]))
361
+ GROUP BY vtbh.name, vtbh.hodina
362
+ WITH DATA;