@golemio/waze-tt 1.1.9 → 1.1.10-dev.981485341

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,1457 @@
1
+ CREATE TABLE analytic.barrande_black_list_route (
2
+ route_id int8 NOT NULL,
3
+ note varchar(250) NULL,
4
+ created_at timestamptz NULL DEFAULT now(),
5
+ CONSTRAINT barrande_black_list_route_pkey PRIMARY KEY (route_id)
6
+ );
7
+
8
+ CREATE TABLE analytic.barrande_route_hour_core (
9
+ "name" text NOT NULL,
10
+ datum date NOT NULL,
11
+ hodina float8 NOT NULL,
12
+ cas_interval text NOT NULL,
13
+ avg_time numeric NULL,
14
+ avg_speed numeric NULL,
15
+ CONSTRAINT barrande_route_hour_core_pkey PRIMARY KEY (name, datum, hodina, cas_interval)
16
+ );
17
+
18
+ CREATE TABLE analytic.barrande_data_all (
19
+ "name" text NOT NULL,
20
+ name_trasa text NOT NULL,
21
+ name_usek text NOT NULL,
22
+ smer text NOT NULL,
23
+ datum date NOT NULL,
24
+ cas_interval text NOT NULL,
25
+ avg_time numeric NULL,
26
+ avg_speed numeric NULL,
27
+ normal_avg_time numeric NULL,
28
+ normal_avg_speed numeric NULL,
29
+ CONSTRAINT barrande_data_all_pkey PRIMARY KEY (name, name_trasa, name_usek, smer, datum, cas_interval)
30
+ );
31
+
32
+ CREATE OR REPLACE VIEW analytic.v_barrande_route_hour_core
33
+ AS SELECT wr.name,
34
+ to_timestamp((rl.update_time / 1000)::double precision)::date AS datum,
35
+ date_part('hour'::text, to_timestamp((rl.update_time / 1000)::double precision)) AS hodina,
36
+ (to_char(date_part('hour'::text, to_timestamp((rl.update_time / 1000)::double precision)), '09'::text) || ' -'::text) || to_char(date_part('hour'::text, to_timestamp((rl.update_time / 1000)::double precision)) + 1::double precision, '09'::text) AS cas_interval,
37
+ round(avg(rl."time"), 2) AS avg_time,
38
+ round(avg(rl.length * 1000 / (rl."time" * 360)), 2) AS avg_speed
39
+ FROM wazett.wazett_route_lives rl
40
+ JOIN wazett.wazett_routes wr ON wr.id = rl.route_id
41
+ WHERE rl.length > 0 AND "left"(wr.name, 2) = 'BM'::text AND NOT (EXISTS ( SELECT 1
42
+ FROM analytic.barrande_black_list_route bl
43
+ WHERE bl.route_id = rl.route_id))
44
+ GROUP BY wr.name, (to_timestamp((rl.update_time / 1000)::double precision)::date), (date_part('hour'::text, to_timestamp((rl.update_time / 1000)::double precision)));
45
+
46
+ CREATE MATERIALIZED VIEW analytic.mv_barrande_normal
47
+ TABLESPACE pg_default
48
+ AS SELECT vtbh.name,
49
+ vtbh.hodina,
50
+ round(avg(vtbh.avg_time), 2) AS avg_time,
51
+ round(avg(vtbh.avg_speed)) AS avg_speed
52
+ FROM analytic.v_barrande_route_hour_core vtbh
53
+ WHERE vtbh.datum >= '2022-04-24'::date AND vtbh.datum <= '2022-05-05'::date AND (date_part('dow'::text, vtbh.datum) = ANY (ARRAY[2::double precision, 3::double precision, 4::double precision]))
54
+ GROUP BY vtbh.name, vtbh.hodina
55
+ WITH DATA;
56
+ CREATE INDEX mv_barrande_normal_idx ON analytic.mv_barrande_normal USING btree (name, hodina);
57
+
58
+
59
+ CREATE OR REPLACE VIEW analytic.v_barrande_route_hour
60
+ AS SELECT p.name,
61
+ p.datum,
62
+ p.hodina,
63
+ p.cas_interval,
64
+ p.avg_time,
65
+ p.avg_speed,
66
+ n.avg_time AS normal_avg_time,
67
+ n.avg_speed AS normal_avg_speed
68
+ FROM analytic.v_barrande_route_hour_core p
69
+ LEFT JOIN analytic.mv_barrande_normal n ON n.name = p.name AND p.hodina = n.hodina;
70
+
71
+
72
+ CREATE OR REPLACE PROCEDURE analytic.update_barande()
73
+ LANGUAGE plpgsql
74
+ AS $procedure$
75
+ declare
76
+ lastupdatetimestamp timestamptz;
77
+ lastupdateunix bigint;
78
+ begin
79
+ select
80
+ case
81
+ when start_day is not null
82
+ then start_day
83
+ else '2021-01-01'
84
+ end as start_day_from into lastupdatetimestamp
85
+ from (select max(datum)-interval '1 days' start_day from analytic.barrande_route_hour_core) barandemax;
86
+
87
+ lastupdateunix := extract ('epoch' from lastupdatetimestamp) * 1000;
88
+
89
+
90
+ insert into analytic.barrande_route_hour_core
91
+ SELECT
92
+ wr.name,
93
+ to_timestamp((rl.update_time / 1000)::double precision)::date AS datum,
94
+ date_part('hour'::text, to_timestamp((rl.update_time / 1000)::double precision)) AS hodina,
95
+ (to_char(date_part('hour'::text, to_timestamp((rl.update_time / 1000)::double precision)), '09'::text) || ' -'::text) || to_char(date_part('hour'::text, to_timestamp((rl.update_time / 1000)::double precision)) + 1::double precision, '09'::text) AS cas_interval,
96
+ round(avg(rl."time"), 2) AS avg_time,
97
+ round(avg(rl.length * 1000 / (rl."time" * 360)), 2) AS avg_speed
98
+ FROM wazett.wazett_route_lives rl
99
+ JOIN wazett.wazett_routes wr ON wr.id = rl.route_id
100
+ WHERE
101
+ rl.update_time > lastupdateunix and
102
+ rl.length > 0 AND "left"(wr.name, 2) = 'BM'::text AND NOT (EXISTS ( SELECT 1
103
+ FROM analytic.barrande_black_list_route bl
104
+ WHERE bl.route_id = rl.route_id))
105
+ GROUP BY wr.name, (to_timestamp((rl.update_time / 1000)::double precision)::date), (date_part('hour'::text, to_timestamp((rl.update_time / 1000)::double precision)))
106
+ ON CONFLICT (name,datum,hodina,cas_interval)
107
+ DO update
108
+ SET avg_time = EXCLUDED.avg_time,
109
+ avg_speed = EXCLUDED.avg_speed;
110
+
111
+
112
+ insert into analytic.barrande_data_all
113
+ WITH
114
+ v_barrande_route_hour as (
115
+ SELECT p.name,
116
+ p.datum,
117
+ p.hodina,
118
+ p.cas_interval,
119
+ p.avg_time,
120
+ p.avg_speed,
121
+ n.avg_time AS normal_avg_time,
122
+ n.avg_speed AS normal_avg_speed
123
+ FROM analytic.barrande_route_hour_core p
124
+ LEFT JOIN analytic.mv_barrande_normal n ON n.name = p.name AND p.hodina = n.hodina
125
+ where datum > lastupdatetimestamp
126
+ ),
127
+ -- konec v_barrande_route_hour
128
+ v_barrande_union_time_interval as (
129
+ WITH hodiny AS (
130
+ SELECT brh.name,
131
+ brh.datum,
132
+ brh.hodina,
133
+ brh.cas_interval,
134
+ brh.avg_time,
135
+ brh.avg_speed,
136
+ brh.normal_avg_time,
137
+ brh.normal_avg_speed
138
+ FROM v_barrande_route_hour brh
139
+ WHERE brh.datum < CURRENT_DATE OR brh.hodina < date_part('hour'::text, now())
140
+ ), den AS (
141
+ SELECT hodiny.name,
142
+ hodiny.datum,
143
+ '0 - 24h'::text AS cas_interval,
144
+ round(avg(hodiny.avg_time), 2) AS avg_time,
145
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
146
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
147
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
148
+ FROM hodiny
149
+ WHERE hodiny.datum < CURRENT_DATE
150
+ GROUP BY hodiny.name, hodiny.datum
151
+ ), h15_18 AS (
152
+ SELECT hodiny.name,
153
+ hodiny.datum,
154
+ '15 -18'::text AS cas_interval,
155
+ round(avg(hodiny.avg_time), 2) AS avg_time,
156
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
157
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
158
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
159
+ FROM hodiny
160
+ WHERE hodiny.hodina >= 15::double precision AND hodiny.hodina <= 17::double precision AND (hodiny.datum < CURRENT_DATE OR hodiny.hodina > 17::double precision)
161
+ GROUP BY hodiny.name, hodiny.datum
162
+ ), h22_6 AS (
163
+ SELECT hodiny.name,
164
+ hodiny.datum,
165
+ '22 - 06'::text AS cas_interval,
166
+ round(avg(hodiny.avg_time), 2) AS avg_time,
167
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
168
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
169
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
170
+ FROM hodiny
171
+ WHERE NOT (hodiny.hodina >= 6::double precision AND hodiny.hodina <= 21::double precision) AND hodiny.datum < CURRENT_DATE
172
+ GROUP BY hodiny.name, hodiny.datum
173
+ ), h6_22 AS (
174
+ SELECT hodiny.name,
175
+ hodiny.datum,
176
+ '06 - 22'::text AS cas_interval,
177
+ round(avg(hodiny.avg_time), 2) AS avg_time,
178
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
179
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
180
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
181
+ FROM hodiny
182
+ WHERE hodiny.hodina >= 6::double precision AND hodiny.hodina <= 21::double precision AND (hodiny.datum < CURRENT_DATE OR hodiny.hodina > 21::double precision)
183
+ GROUP BY hodiny.name, hodiny.datum
184
+ ), h7_10 AS (
185
+ SELECT hodiny.name,
186
+ hodiny.datum,
187
+ '07 - 10'::text AS cas_interval,
188
+ round(avg(hodiny.avg_time), 2) AS avg_time,
189
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
190
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
191
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
192
+ FROM hodiny
193
+ WHERE hodiny.hodina >= 7::double precision AND hodiny.hodina <= 9::double precision AND (hodiny.datum < CURRENT_DATE OR hodiny.hodina > 10::double precision)
194
+ GROUP BY hodiny.name, hodiny.datum
195
+ ), h7_11_15_19 AS (
196
+ SELECT hodiny.name,
197
+ hodiny.datum,
198
+ '07 - 11, 15 - 19'::text AS cas_interval,
199
+ round(avg(hodiny.avg_time), 2) AS avg_time,
200
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
201
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
202
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
203
+ FROM hodiny
204
+ 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)
205
+ GROUP BY hodiny.name, hodiny.datum
206
+ )
207
+ SELECT hodiny.name,
208
+ hodiny.datum,
209
+ hodiny.cas_interval,
210
+ hodiny.avg_time,
211
+ hodiny.avg_speed,
212
+ hodiny.normal_avg_time,
213
+ hodiny.normal_avg_speed
214
+ FROM hodiny
215
+ UNION ALL
216
+ SELECT den.name,
217
+ den.datum,
218
+ den.cas_interval,
219
+ den.avg_time,
220
+ den.avg_speed,
221
+ den.normal_avg_time,
222
+ den.normal_avg_speed
223
+ FROM den
224
+ UNION ALL
225
+ SELECT h15_18.name,
226
+ h15_18.datum,
227
+ h15_18.cas_interval,
228
+ h15_18.avg_time,
229
+ h15_18.avg_speed,
230
+ h15_18.normal_avg_time,
231
+ h15_18.normal_avg_speed
232
+ FROM h15_18
233
+ UNION ALL
234
+ SELECT h22_6.name,
235
+ h22_6.datum,
236
+ h22_6.cas_interval,
237
+ h22_6.avg_time,
238
+ h22_6.avg_speed,
239
+ h22_6.normal_avg_time,
240
+ h22_6.normal_avg_speed
241
+ FROM h22_6
242
+ UNION ALL
243
+ SELECT h6_22.name,
244
+ h6_22.datum,
245
+ h6_22.cas_interval,
246
+ h6_22.avg_time,
247
+ h6_22.avg_speed,
248
+ h6_22.normal_avg_time,
249
+ h6_22.normal_avg_speed
250
+ FROM h6_22
251
+ UNION ALL
252
+ SELECT h7_10.name,
253
+ h7_10.datum,
254
+ h7_10.cas_interval,
255
+ h7_10.avg_time,
256
+ h7_10.avg_speed,
257
+ h7_10.normal_avg_time,
258
+ h7_10.normal_avg_speed
259
+ FROM h7_10
260
+ UNION ALL
261
+ SELECT h7_11_15_19.name,
262
+ h7_11_15_19.datum,
263
+ h7_11_15_19.cas_interval,
264
+ h7_11_15_19.avg_time,
265
+ h7_11_15_19.avg_speed,
266
+ h7_11_15_19.normal_avg_time,
267
+ h7_11_15_19.normal_avg_speed
268
+ FROM h7_11_15_19
269
+ ),
270
+ -----------------------
271
+ data1 AS (
272
+ SELECT
273
+ trasy.name,
274
+ trasy.name_trasa,
275
+ trasy.name_usek,
276
+ CASE
277
+ WHEN trasy.is_opacny_smer THEN 'Zpět'::text
278
+ ELSE 'Tam'::text
279
+ END AS smer,
280
+ vbu.datum,
281
+ vbu.cas_interval,
282
+ vbu.avg_time,
283
+ vbu.avg_speed,
284
+ vbu.normal_avg_time,
285
+ vbu.normal_avg_speed
286
+ FROM v_barrande_union_time_interval vbu
287
+ JOIN analytic.v_barrande_route trasy ON trasy.name = vbu.name
288
+ ),
289
+ data2 AS (
290
+ SELECT
291
+ data1.name_trasa,
292
+ data1.name_usek,
293
+ 'Oba'::text AS smer,
294
+ data1.datum,
295
+ data1.cas_interval,
296
+ sum(data1.avg_time) AS avg_time,
297
+ avg(data1.avg_speed) AS avg_speed,
298
+ sum(data1.normal_avg_time) AS normal_avg_time,
299
+ avg(data1.normal_avg_speed) AS normal_avg_speed
300
+ FROM data1
301
+ GROUP BY data1.name_trasa, data1.name_usek, 'Oba'::text, data1.datum, data1.cas_interval
302
+ )
303
+ SELECT data1.name,
304
+ data1.name_trasa,
305
+ data1.name_usek,
306
+ data1.smer,
307
+ data1.datum,
308
+ data1.cas_interval,
309
+ data1.avg_time,
310
+ data1.avg_speed,
311
+ data1.normal_avg_time,
312
+ data1.normal_avg_speed
313
+ FROM data1
314
+ UNION
315
+ SELECT vbt.name,
316
+ data2.name_trasa,
317
+ data2.name_usek,
318
+ data2.smer,
319
+ data2.datum,
320
+ data2.cas_interval,
321
+ data2.avg_time,
322
+ data2.avg_speed,
323
+ data2.normal_avg_time,
324
+ data2.normal_avg_speed
325
+ FROM data2
326
+ JOIN analytic.v_barrande_route vbt ON vbt.name_trasa = data2.name_trasa AND vbt.name_usek = data2.name_usek AND NOT vbt.is_opacny_smer
327
+ on conflict (name,name_trasa,name_usek,smer,datum,cas_interval)
328
+ do update
329
+ SET avg_time = EXCLUDED.avg_time,
330
+ avg_speed = EXCLUDED.avg_speed,
331
+ normal_avg_time = EXCLUDED.normal_avg_time,
332
+ normal_avg_speed = EXCLUDED.normal_avg_speed;
333
+ end;
334
+ $procedure$
335
+ ;
336
+
337
+
338
+ CREATE OR REPLACE VIEW analytic.v_barrandov_bridge_route_live
339
+ AS SELECT wrl.route_id,
340
+ to_timestamp((wrl.update_time / 1000)::double precision) AS update_time,
341
+ wrl."time",
342
+ wrl.length,
343
+ wrl.historic_time,
344
+ wrl.jam_level,
345
+ wrl.create_batch_id,
346
+ wrl.created_at,
347
+ wrl.created_by,
348
+ wrl.update_batch_id,
349
+ wrl.updated_at,
350
+ wrl.updated_by
351
+ FROM wazett.wazett_route_lives wrl
352
+ WHERE (wrl.route_id IN ( SELECT DISTINCT wazett_routes.id
353
+ FROM wazett.wazett_routes
354
+ WHERE wazett_routes.name ~~ 'BM %'::text)) AND wrl.update_time::double precision >= (date_part('epoch'::text, CURRENT_DATE - '7 days'::interval) * 1000::double precision);
355
+
356
+ CREATE OR REPLACE VIEW analytic.v_barrandov_bridge_route_details
357
+ AS SELECT re.id,
358
+ re.name,
359
+ re.section,
360
+ re.reverse_direction,
361
+ re.from_name,
362
+ re.to_name,
363
+ re.poradi
364
+ FROM ( SELECT r.id,
365
+ r.name,
366
+ CASE
367
+ WHEN r.name ~~ '% ÚS %'::text THEN true
368
+ WHEN r.name ~~ '% TN %'::text THEN false
369
+ ELSE NULL::boolean
370
+ END AS section,
371
+ CASE
372
+ WHEN r.name ~~ '% OS%'::text THEN true
373
+ ELSE false
374
+ END AS reverse_direction,
375
+ r.from_name,
376
+ r.to_name,
377
+ row_number() OVER (PARTITION BY r.name ORDER BY r.id DESC) AS poradi
378
+ FROM wazett.wazett_routes r
379
+ WHERE "left"(r.name, 2) = 'BM'::text) re;
380
+
381
+
382
+
383
+ CREATE OR REPLACE VIEW analytic.v_barrande_union_time_interval
384
+ AS WITH hodiny AS (
385
+ SELECT brh.name,
386
+ brh.datum,
387
+ brh.hodina,
388
+ brh.cas_interval,
389
+ brh.avg_time,
390
+ brh.avg_speed,
391
+ brh.normal_avg_time,
392
+ brh.normal_avg_speed
393
+ FROM analytic.v_barrande_route_hour brh
394
+ WHERE brh.datum < CURRENT_DATE OR brh.hodina < date_part('hour'::text, now())
395
+ ), den AS (
396
+ SELECT hodiny.name,
397
+ hodiny.datum,
398
+ '0 - 24h'::text AS cas_interval,
399
+ round(avg(hodiny.avg_time), 2) AS avg_time,
400
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
401
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
402
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
403
+ FROM hodiny
404
+ WHERE hodiny.datum < CURRENT_DATE
405
+ GROUP BY hodiny.name, hodiny.datum
406
+ ), h15_18 AS (
407
+ SELECT hodiny.name,
408
+ hodiny.datum,
409
+ '15 -18'::text AS cas_interval,
410
+ round(avg(hodiny.avg_time), 2) AS avg_time,
411
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
412
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
413
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
414
+ FROM hodiny
415
+ WHERE hodiny.hodina >= 15::double precision AND hodiny.hodina <= 17::double precision AND (hodiny.datum < CURRENT_DATE OR hodiny.hodina > 17::double precision)
416
+ GROUP BY hodiny.name, hodiny.datum
417
+ ), h22_6 AS (
418
+ SELECT hodiny.name,
419
+ hodiny.datum,
420
+ '22 - 06'::text AS cas_interval,
421
+ round(avg(hodiny.avg_time), 2) AS avg_time,
422
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
423
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
424
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
425
+ FROM hodiny
426
+ WHERE NOT (hodiny.hodina >= 6::double precision AND hodiny.hodina <= 21::double precision) AND hodiny.datum < CURRENT_DATE
427
+ GROUP BY hodiny.name, hodiny.datum
428
+ ), h6_22 AS (
429
+ SELECT hodiny.name,
430
+ hodiny.datum,
431
+ '06 - 22'::text AS cas_interval,
432
+ round(avg(hodiny.avg_time), 2) AS avg_time,
433
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
434
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
435
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
436
+ FROM hodiny
437
+ WHERE hodiny.hodina >= 6::double precision AND hodiny.hodina <= 21::double precision AND (hodiny.datum < CURRENT_DATE OR hodiny.hodina > 21::double precision)
438
+ GROUP BY hodiny.name, hodiny.datum
439
+ ), h7_10 AS (
440
+ SELECT hodiny.name,
441
+ hodiny.datum,
442
+ '07 - 10'::text AS cas_interval,
443
+ round(avg(hodiny.avg_time), 2) AS avg_time,
444
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
445
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
446
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
447
+ FROM hodiny
448
+ WHERE hodiny.hodina >= 7::double precision AND hodiny.hodina <= 9::double precision AND (hodiny.datum < CURRENT_DATE OR hodiny.hodina > 10::double precision)
449
+ GROUP BY hodiny.name, hodiny.datum
450
+ ), h7_11_15_19 AS (
451
+ SELECT hodiny.name,
452
+ hodiny.datum,
453
+ '07 - 11, 15 - 19'::text AS cas_interval,
454
+ round(avg(hodiny.avg_time), 2) AS avg_time,
455
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
456
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
457
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
458
+ FROM hodiny
459
+ 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)
460
+ GROUP BY hodiny.name, hodiny.datum
461
+ )
462
+ SELECT hodiny.name,
463
+ hodiny.datum,
464
+ hodiny.cas_interval,
465
+ hodiny.avg_time,
466
+ hodiny.avg_speed,
467
+ hodiny.normal_avg_time,
468
+ hodiny.normal_avg_speed
469
+ FROM hodiny
470
+ UNION ALL
471
+ SELECT den.name,
472
+ den.datum,
473
+ den.cas_interval,
474
+ den.avg_time,
475
+ den.avg_speed,
476
+ den.normal_avg_time,
477
+ den.normal_avg_speed
478
+ FROM den
479
+ UNION ALL
480
+ SELECT h15_18.name,
481
+ h15_18.datum,
482
+ h15_18.cas_interval,
483
+ h15_18.avg_time,
484
+ h15_18.avg_speed,
485
+ h15_18.normal_avg_time,
486
+ h15_18.normal_avg_speed
487
+ FROM h15_18
488
+ UNION ALL
489
+ SELECT h22_6.name,
490
+ h22_6.datum,
491
+ h22_6.cas_interval,
492
+ h22_6.avg_time,
493
+ h22_6.avg_speed,
494
+ h22_6.normal_avg_time,
495
+ h22_6.normal_avg_speed
496
+ FROM h22_6
497
+ UNION ALL
498
+ SELECT h6_22.name,
499
+ h6_22.datum,
500
+ h6_22.cas_interval,
501
+ h6_22.avg_time,
502
+ h6_22.avg_speed,
503
+ h6_22.normal_avg_time,
504
+ h6_22.normal_avg_speed
505
+ FROM h6_22
506
+ UNION ALL
507
+ SELECT h7_10.name,
508
+ h7_10.datum,
509
+ h7_10.cas_interval,
510
+ h7_10.avg_time,
511
+ h7_10.avg_speed,
512
+ h7_10.normal_avg_time,
513
+ h7_10.normal_avg_speed
514
+ FROM h7_10
515
+ UNION ALL
516
+ SELECT h7_11_15_19.name,
517
+ h7_11_15_19.datum,
518
+ h7_11_15_19.cas_interval,
519
+ h7_11_15_19.avg_time,
520
+ h7_11_15_19.avg_speed,
521
+ h7_11_15_19.normal_avg_time,
522
+ h7_11_15_19.normal_avg_speed
523
+ FROM h7_11_15_19;
524
+
525
+
526
+ CREATE OR REPLACE VIEW analytic.v_barrande_last_update
527
+ AS SELECT to_timestamp((wrl.update_time / 1000)::double precision)::timestamp without time zone AS last_update
528
+ FROM wazett.wazett_route_lives wrl
529
+ LEFT JOIN wazett.wazett_routes wr ON wrl.route_id = wr.id
530
+ WHERE "left"(wr.name, 3) = 'BM '::text
531
+ ORDER BY wrl.update_time DESC
532
+ LIMIT 1;
533
+
534
+
535
+ CREATE OR REPLACE VIEW analytic.v_barrande_route
536
+ AS SELECT DISTINCT ON (wazett_routes.name) wazett_routes.name,
537
+ CASE
538
+ WHEN "position"(wazett_routes.name, ' TN'::text) > 0 THEN true
539
+ ELSE false
540
+ END AS is_trasa,
541
+ CASE
542
+ WHEN "position"(wazett_routes.name, ' ÚS'::text) > 0 THEN true
543
+ ELSE false
544
+ END AS is_usek,
545
+ CASE
546
+ WHEN "position"(wazett_routes.name, ' OS'::text) > 0 THEN true
547
+ ELSE false
548
+ END AS is_opacny_smer,
549
+ CASE
550
+ WHEN wazett_routes.id = ANY (ARRAY[32875, 32876]) THEN 'OICT 3 DO'::text
551
+ WHEN wazett_routes.id = ANY (ARRAY[32888, 32889]) THEN 'OICT 3 OD'::text
552
+ ELSE "substring"(wazett_routes.name, 4,
553
+ CASE
554
+ WHEN "position"(wazett_routes.name, ' TN'::text) > 0 THEN "position"(wazett_routes.name, ' TN'::text) - 3
555
+ WHEN "position"(wazett_routes.name, ' ÚS'::text) > 0 THEN "position"(wazett_routes.name, ' ÚS'::text) - 3
556
+ ELSE NULL::integer
557
+ END)
558
+ END AS name_trasa,
559
+ "substring"(wazett_routes.name,
560
+ CASE
561
+ WHEN "position"(wazett_routes.name, ' ÚS'::text) > 0 THEN "position"(wazett_routes.name, ' ÚS'::text) + 4
562
+ ELSE length(wazett_routes.name) + 1
563
+ END,
564
+ CASE
565
+ WHEN "position"(wazett_routes.name, ' OS'::text) > 0 THEN "position"(wazett_routes.name, ' OS'::text) - "position"(wazett_routes.name, ' ÚS'::text) - 4
566
+ ELSE length(wazett_routes.name) - "position"(wazett_routes.name, ' ÚS'::text)
567
+ END) AS name_usek
568
+ FROM wazett.wazett_routes
569
+ WHERE "left"(wazett_routes.name, 2) = 'BM'::text AND NOT (EXISTS ( SELECT 1
570
+ FROM analytic.barrande_black_list_route bl
571
+ WHERE bl.route_id = wazett_routes.id))
572
+ ORDER BY wazett_routes.name, wazett_routes.created_at DESC;
573
+
574
+ CREATE OR REPLACE VIEW analytic.v_barrande_data_all
575
+ AS WITH data1 AS (
576
+ SELECT trasy.name,
577
+ trasy.name_trasa,
578
+ trasy.name_usek,
579
+ CASE
580
+ WHEN trasy.is_opacny_smer THEN 'Zpět'::text
581
+ ELSE 'Tam'::text
582
+ END AS smer,
583
+ vbu.datum,
584
+ vbu.cas_interval,
585
+ vbu.avg_time,
586
+ vbu.avg_speed,
587
+ vbu.normal_avg_time,
588
+ vbu.normal_avg_speed
589
+ FROM analytic.v_barrande_union_time_interval vbu
590
+ JOIN analytic.v_barrande_route trasy ON trasy.name = vbu.name
591
+ ), data2 AS (
592
+ SELECT data1.name_trasa,
593
+ data1.name_usek,
594
+ 'Oba'::text AS smer,
595
+ data1.datum,
596
+ data1.cas_interval,
597
+ sum(data1.avg_time) AS avg_time,
598
+ avg(data1.avg_speed) AS avg_speed,
599
+ sum(data1.normal_avg_time) AS normal_avg_time,
600
+ avg(data1.normal_avg_speed) AS normal_avg_speed
601
+ FROM data1
602
+ GROUP BY data1.name_trasa, data1.name_usek, 'Oba'::text, data1.datum, data1.cas_interval
603
+ )
604
+ SELECT data1.name,
605
+ data1.name_trasa,
606
+ data1.name_usek,
607
+ data1.smer,
608
+ data1.datum,
609
+ data1.cas_interval,
610
+ data1.avg_time,
611
+ data1.avg_speed,
612
+ data1.normal_avg_time,
613
+ data1.normal_avg_speed
614
+ FROM data1
615
+ UNION
616
+ SELECT vbt.name,
617
+ data2.name_trasa,
618
+ data2.name_usek,
619
+ data2.smer,
620
+ data2.datum,
621
+ data2.cas_interval,
622
+ data2.avg_time,
623
+ data2.avg_speed,
624
+ data2.normal_avg_time,
625
+ data2.normal_avg_speed
626
+ FROM data2
627
+ JOIN analytic.v_barrande_route vbt ON vbt.name_trasa = data2.name_trasa AND vbt.name_usek = data2.name_usek AND NOT vbt.is_opacny_smer;
628
+
629
+
630
+
631
+ CREATE TABLE analytic.waze_dashboard_route_name (
632
+ route_id int8 NOT NULL,
633
+ idx int4 NULL,
634
+ "from" varchar(100) NULL,
635
+ "to" varchar(100) NULL,
636
+ db_name varchar(100) NULL,
637
+ "name" varchar(500) NULL,
638
+ CONSTRAINT waze_dashboard_route_name_pkey PRIMARY KEY (route_id)
639
+ );
640
+
641
+ -- analytic.v_route_live source
642
+
643
+ CREATE OR REPLACE VIEW analytic.v_route_live
644
+ AS SELECT wrl.route_id,
645
+ wrl.update_time,
646
+ wrl."time",
647
+ wrl.length,
648
+ wrl.historic_time,
649
+ wrl.jam_level,
650
+ wrl.create_batch_id,
651
+ wrl.created_at,
652
+ wrl.created_by,
653
+ wrl.update_batch_id,
654
+ wrl.updated_at,
655
+ wrl.updated_by
656
+ FROM wazett.wazett_route_lives wrl
657
+ WHERE (wrl.route_id = ANY (ARRAY[24949, 24953, 24962, 24924, 24925, 24950, 24951, 24952, 24954, 24955, 24956, 24957, 24958, 24960, 24961, 24963, 24964, 24965, 24966, 24967, 24968, 24969])) AND wrl.update_time::double precision >= (( SELECT max(wazett_route_lives.update_time)::double precision - date_part('epoch'::text, '1 year'::interval) * 1000::double precision AS max
658
+ FROM wazett.wazett_route_lives));
659
+
660
+ -- analytic.v_route_travel_times source
661
+
662
+ CREATE OR REPLACE VIEW analytic.v_route_travel_times
663
+ AS SELECT ts.route_id,
664
+ ts.year,
665
+ ts.month,
666
+ ts.day,
667
+ ts.dow,
668
+ ts.hour,
669
+ ts.quarter,
670
+ ts.hour + (ts.quarter::numeric / 60::numeric)::double precision AS hour_quarter,
671
+ ((((((((ts.year || '-'::text) || ts.month) || '-'::text) || ts.day) || ' '::text) || ts.hour) || ':'::text) || ts.quarter)::timestamp without time zone AS date,
672
+ avg(ts.travel_time)::integer AS travel_time
673
+ FROM ( SELECT raw.route_id,
674
+ raw.update_time,
675
+ raw.travel_time,
676
+ date_part('year'::text, raw.update_time) AS year,
677
+ date_part('month'::text, raw.update_time) AS month,
678
+ date_part('day'::text, raw.update_time) AS day,
679
+ date_part('dow'::text, raw.update_time) AS dow,
680
+ date_part('hour'::text, raw.update_time) AS hour,
681
+ date_part('minute'::text, raw.update_time) AS minute,
682
+ date_part('minute'::text, raw.update_time)::integer / 15 * 15 AS quarter
683
+ FROM ( SELECT wazett_route_lives.route_id,
684
+ timezone('Europe/Prague'::text, to_timestamp((wazett_route_lives.update_time / 1000)::double precision)::timestamp without time zone) AS update_time,
685
+ wazett_route_lives."time" AS travel_time
686
+ FROM wazett.wazett_route_lives
687
+ JOIN analytic.waze_dashboard_route_name wdrn ON wdrn.route_id = wazett_route_lives.route_id) raw) ts
688
+ WHERE ts.year > 2000::double precision
689
+ GROUP BY ts.route_id, ts.year, ts.month, ts.day, ts.dow, ts.hour, ts.quarter;
690
+
691
+ CREATE TABLE analytic.mala_strana_route_hour_core (
692
+ "name" text NOT NULL,
693
+ datum date NOT NULL,
694
+ hodina float8 NOT NULL,
695
+ cas_interval text NOT NULL,
696
+ avg_time numeric NULL,
697
+ avg_speed numeric NULL,
698
+ CONSTRAINT mala_strana_route_hour_core_pkey PRIMARY KEY (name, datum, hodina, cas_interval)
699
+ );
700
+ CREATE INDEX mala_strana_route_hour_core_date ON analytic.mala_strana_route_hour_core USING btree (datum);
701
+
702
+ CREATE TABLE analytic.mala_strana_data_all (
703
+ "name" text NOT NULL,
704
+ name_trasa text NOT NULL,
705
+ name_usek text NOT NULL,
706
+ smer text NOT NULL,
707
+ datum date NOT NULL,
708
+ cas_interval text NOT NULL,
709
+ avg_time numeric NULL,
710
+ avg_speed numeric NULL,
711
+ normal_avg_time numeric NULL,
712
+ normal_avg_speed numeric NULL
713
+ );
714
+ CREATE UNIQUE INDEX mala_strana_data_all_pkey ON analytic.mala_strana_data_all USING btree (name, name_trasa, name_usek, smer, datum, cas_interval);
715
+
716
+ CREATE OR REPLACE VIEW analytic.v_mala_strana_route
717
+ AS SELECT DISTINCT ON (wdrn.name) wdrn.name,
718
+ true AS is_trasa,
719
+ false AS is_usek,
720
+ false AS is_opacny_smer,
721
+ wdrn.name AS name_trasa,
722
+ "substring"(wazett_routes.name,
723
+ CASE
724
+ WHEN "position"(wazett_routes.name, ' ÚS'::text) > 0 THEN "position"(wazett_routes.name, ' ÚS'::text) + 4
725
+ ELSE length(wazett_routes.name) + 1
726
+ END,
727
+ CASE
728
+ WHEN "position"(wazett_routes.name, ' OS'::text) > 0 THEN "position"(wazett_routes.name, ' OS'::text) - "position"(wazett_routes.name, ' ÚS'::text) - 4
729
+ ELSE length(wazett_routes.name) - "position"(wazett_routes.name, ' ÚS'::text)
730
+ END) AS name_usek
731
+ FROM wazett.wazett_routes
732
+ JOIN analytic.waze_dashboard_route_name wdrn ON wazett_routes.id = wdrn.route_id
733
+ ORDER BY wdrn.name, wazett_routes.created_at DESC;
734
+
735
+ CREATE MATERIALIZED VIEW analytic.mv_mala_strana_normal
736
+ TABLESPACE pg_default
737
+ AS SELECT vtbh.name,
738
+ vtbh.hodina,
739
+ round(avg(vtbh.avg_time), 2) AS avg_time,
740
+ round(avg(vtbh.avg_speed)) AS avg_speed
741
+ FROM ( SELECT wdrn.name,
742
+ CASE
743
+ WHEN wdrn.idx < 38 THEN 'group1'::text
744
+ ELSE 'group2'::text
745
+ END AS skupina,
746
+ rl.ts::date AS datum,
747
+ date_part('hour'::text, rl.ts) AS hodina,
748
+ (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,
749
+ rl.avg_time,
750
+ rl.avg_speed
751
+ FROM ( SELECT rl_1.route_id,
752
+ date_trunc('hour'::text, to_timestamp((rl_1.update_time / 1000)::double precision)) AS ts,
753
+ round(avg(rl_1."time"), 2) AS avg_time,
754
+ round(avg(rl_1.length * 1000 / (NULLIF(rl_1."time", 0) * 360)), 2) AS avg_speed
755
+ FROM wazett.wazett_route_lives rl_1
756
+ WHERE rl_1.update_time >= '1665360000000'::bigint
757
+ GROUP BY rl_1.route_id, (date_trunc('hour'::text, to_timestamp((rl_1.update_time / 1000)::double precision)))) rl
758
+ JOIN analytic.waze_dashboard_route_name wdrn ON wdrn.route_id = rl.route_id) vtbh
759
+ 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 = 'group2'::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]))
760
+ GROUP BY vtbh.name, vtbh.hodina
761
+ WITH DATA;
762
+
763
+
764
+ CREATE OR REPLACE PROCEDURE analytic.update_mala_strana()
765
+ LANGUAGE plpgsql
766
+ AS $procedure$
767
+ declare
768
+ lastupdatetimestamp timestamptz;
769
+ lastupdateunix bigint;
770
+ begin
771
+ begin
772
+ select
773
+ case
774
+ when start_day is not null
775
+ then start_day
776
+ else '2022-01-01'
777
+ end as start_day_from into lastupdatetimestamp
778
+ from (select max(datum)-interval '1 days' start_day from analytic.mala_strana_route_hour_core) malastranamax;
779
+
780
+ lastupdateunix := extract ('epoch' from lastupdatetimestamp) * 1000;
781
+
782
+ -- dopoctu hodinovou agregaci (podobné v_mala_strana_route_hour_core) POT5EBUJEME TAKTO?
783
+ insert into analytic.mala_strana_route_hour_core
784
+ SELECT
785
+ wdrn.name,
786
+ rl.ts::date AS datum,
787
+ date_part('hour'::text, rl.ts) AS hodina,
788
+ (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,
789
+ avg_time,
790
+ avg_speed
791
+ FROM (
792
+ select
793
+ route_id
794
+ -- timezone('Europe/Prague'::text, to_timestamp((update_time / 1000)::double precision)::timestamp without time zone)
795
+ ,date_trunc('hour', to_timestamp((update_time / 1000))::timestamp) as ts
796
+ ,round(avg(time), 2) AS avg_time
797
+ ,round(avg(rl.length * 1000 / (nullif(rl."time", 0) * 360)), 2) AS avg_speed
798
+ from wazett.wazett_route_lives rl
799
+ where
800
+ -- route_id = 22706 and
801
+ rl.update_time > lastupdateunix and
802
+ rl.length > 0
803
+ group by 1,2) rl
804
+ JOIN analytic.waze_dashboard_route_name wdrn ON wdrn.route_id = rl.route_id
805
+ ON CONFLICT (name,datum,hodina,cas_interval)
806
+ DO update
807
+ SET avg_time = EXCLUDED.avg_time,
808
+ avg_speed = EXCLUDED.avg_speed
809
+ ;
810
+
811
+ insert into analytic.mala_strana_data_all
812
+ WITH
813
+ v_ms_route_hour as (
814
+ SELECT p.name,
815
+ p.datum,
816
+ p.hodina,
817
+ p.cas_interval,
818
+ p.avg_time,
819
+ p.avg_speed,
820
+ n.avg_time AS normal_avg_time,
821
+ n.avg_speed AS normal_avg_speed
822
+ FROM analytic.mala_strana_route_hour_core p
823
+ LEFT JOIN analytic.mv_mala_strana_normal n ON n.name = p.name AND p.hodina = n.hodina
824
+ where datum > lastupdatetimestamp
825
+ ),
826
+ -- konec v_ms_route_hour
827
+ v_ms_union_time_interval as (
828
+ WITH hodiny AS (
829
+ SELECT brh.name,
830
+ brh.datum,
831
+ brh.hodina,
832
+ brh.cas_interval,
833
+ brh.avg_time,
834
+ brh.avg_speed,
835
+ brh.normal_avg_time,
836
+ brh.normal_avg_speed
837
+ FROM v_ms_route_hour brh
838
+ WHERE brh.datum < CURRENT_DATE OR brh.hodina < date_part('hour'::text, now())
839
+ ), den AS (
840
+ SELECT hodiny.name,
841
+ hodiny.datum,
842
+ '0 - 24h'::text AS cas_interval,
843
+ round(avg(hodiny.avg_time), 2) AS avg_time,
844
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
845
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
846
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
847
+ FROM hodiny
848
+ WHERE hodiny.datum < CURRENT_DATE
849
+ GROUP BY hodiny.name, hodiny.datum
850
+ ), h15_18 AS (
851
+ SELECT hodiny.name,
852
+ hodiny.datum,
853
+ '15 -18'::text AS cas_interval,
854
+ round(avg(hodiny.avg_time), 2) AS avg_time,
855
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
856
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
857
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
858
+ FROM hodiny
859
+ WHERE hodiny.hodina >= 15::double precision AND hodiny.hodina <= 17::double precision AND (hodiny.datum < CURRENT_DATE OR hodiny.hodina > 17::double precision)
860
+ GROUP BY hodiny.name, hodiny.datum
861
+ ), h22_6 AS (
862
+ SELECT hodiny.name,
863
+ hodiny.datum,
864
+ '22 - 06'::text AS cas_interval,
865
+ round(avg(hodiny.avg_time), 2) AS avg_time,
866
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
867
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
868
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
869
+ FROM hodiny
870
+ WHERE NOT (hodiny.hodina >= 6::double precision AND hodiny.hodina <= 21::double precision) AND hodiny.datum < CURRENT_DATE
871
+ GROUP BY hodiny.name, hodiny.datum
872
+ ), h6_22 AS (
873
+ SELECT hodiny.name,
874
+ hodiny.datum,
875
+ '06 - 22'::text AS cas_interval,
876
+ round(avg(hodiny.avg_time), 2) AS avg_time,
877
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
878
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
879
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
880
+ FROM hodiny
881
+ WHERE hodiny.hodina >= 6::double precision AND hodiny.hodina <= 21::double precision AND (hodiny.datum < CURRENT_DATE OR hodiny.hodina > 21::double precision)
882
+ GROUP BY hodiny.name, hodiny.datum
883
+ ), h7_10 AS (
884
+ SELECT hodiny.name,
885
+ hodiny.datum,
886
+ '07 - 10'::text AS cas_interval,
887
+ round(avg(hodiny.avg_time), 2) AS avg_time,
888
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
889
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
890
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
891
+ FROM hodiny
892
+ WHERE hodiny.hodina >= 7::double precision AND hodiny.hodina <= 9::double precision AND (hodiny.datum < CURRENT_DATE OR hodiny.hodina > 10::double precision)
893
+ GROUP BY hodiny.name, hodiny.datum
894
+ ), h7_11_15_19 AS (
895
+ SELECT hodiny.name,
896
+ hodiny.datum,
897
+ '07 - 11, 15 - 19'::text AS cas_interval,
898
+ round(avg(hodiny.avg_time), 2) AS avg_time,
899
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
900
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
901
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
902
+ FROM hodiny
903
+ 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)
904
+ GROUP BY hodiny.name, hodiny.datum
905
+ )
906
+ SELECT hodiny.name,
907
+ hodiny.datum,
908
+ hodiny.cas_interval,
909
+ hodiny.avg_time,
910
+ hodiny.avg_speed,
911
+ hodiny.normal_avg_time,
912
+ hodiny.normal_avg_speed
913
+ FROM hodiny
914
+ UNION ALL
915
+ SELECT den.name,
916
+ den.datum,
917
+ den.cas_interval,
918
+ den.avg_time,
919
+ den.avg_speed,
920
+ den.normal_avg_time,
921
+ den.normal_avg_speed
922
+ FROM den
923
+ UNION ALL
924
+ SELECT h15_18.name,
925
+ h15_18.datum,
926
+ h15_18.cas_interval,
927
+ h15_18.avg_time,
928
+ h15_18.avg_speed,
929
+ h15_18.normal_avg_time,
930
+ h15_18.normal_avg_speed
931
+ FROM h15_18
932
+ UNION ALL
933
+ SELECT h22_6.name,
934
+ h22_6.datum,
935
+ h22_6.cas_interval,
936
+ h22_6.avg_time,
937
+ h22_6.avg_speed,
938
+ h22_6.normal_avg_time,
939
+ h22_6.normal_avg_speed
940
+ FROM h22_6
941
+ UNION ALL
942
+ SELECT h6_22.name,
943
+ h6_22.datum,
944
+ h6_22.cas_interval,
945
+ h6_22.avg_time,
946
+ h6_22.avg_speed,
947
+ h6_22.normal_avg_time,
948
+ h6_22.normal_avg_speed
949
+ FROM h6_22
950
+ UNION ALL
951
+ SELECT h7_10.name,
952
+ h7_10.datum,
953
+ h7_10.cas_interval,
954
+ h7_10.avg_time,
955
+ h7_10.avg_speed,
956
+ h7_10.normal_avg_time,
957
+ h7_10.normal_avg_speed
958
+ FROM h7_10
959
+ UNION ALL
960
+ SELECT h7_11_15_19.name,
961
+ h7_11_15_19.datum,
962
+ h7_11_15_19.cas_interval,
963
+ h7_11_15_19.avg_time,
964
+ h7_11_15_19.avg_speed,
965
+ h7_11_15_19.normal_avg_time,
966
+ h7_11_15_19.normal_avg_speed
967
+ FROM h7_11_15_19
968
+ ),
969
+ -----------------------
970
+ data1 AS (
971
+ SELECT
972
+ trasy.name,
973
+ trasy.name_trasa,
974
+ trasy.name_usek,
975
+ CASE
976
+ WHEN trasy.is_opacny_smer THEN 'Zpět'::text
977
+ ELSE 'Tam'::text
978
+ END AS smer,
979
+ vbu.datum,
980
+ vbu.cas_interval,
981
+ vbu.avg_time,
982
+ vbu.avg_speed,
983
+ vbu.normal_avg_time,
984
+ vbu.normal_avg_speed
985
+ FROM v_ms_union_time_interval vbu
986
+ JOIN analytic.v_mala_strana_route trasy ON trasy.name = vbu.name
987
+ ),
988
+ data2 AS (
989
+ SELECT
990
+ data1.name_trasa,
991
+ data1.name_usek,
992
+ 'Oba'::text AS smer,
993
+ data1.datum,
994
+ data1.cas_interval,
995
+ sum(data1.avg_time) AS avg_time,
996
+ avg(data1.avg_speed) AS avg_speed,
997
+ sum(data1.normal_avg_time) AS normal_avg_time,
998
+ avg(data1.normal_avg_speed) AS normal_avg_speed
999
+ FROM data1
1000
+ GROUP BY data1.name_trasa, data1.name_usek, 'Oba'::text, data1.datum, data1.cas_interval
1001
+ )
1002
+ SELECT data1.name,
1003
+ data1.name_trasa,
1004
+ data1.name_usek,
1005
+ data1.smer,
1006
+ data1.datum,
1007
+ data1.cas_interval,
1008
+ data1.avg_time,
1009
+ data1.avg_speed,
1010
+ data1.normal_avg_time,
1011
+ data1.normal_avg_speed
1012
+ FROM data1
1013
+ UNION
1014
+ SELECT vbt.name,
1015
+ data2.name_trasa,
1016
+ data2.name_usek,
1017
+ data2.smer,
1018
+ data2.datum,
1019
+ data2.cas_interval,
1020
+ data2.avg_time,
1021
+ data2.avg_speed,
1022
+ data2.normal_avg_time,
1023
+ data2.normal_avg_speed
1024
+ FROM data2
1025
+ 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
1026
+ on conflict (name,name_trasa,name_usek,smer,datum,cas_interval)
1027
+ do update
1028
+ SET avg_time = EXCLUDED.avg_time,
1029
+ avg_speed = EXCLUDED.avg_speed,
1030
+ normal_avg_time = EXCLUDED.normal_avg_time,
1031
+ normal_avg_speed = EXCLUDED.normal_avg_speed;
1032
+ end;
1033
+ end;
1034
+ $procedure$
1035
+ ;
1036
+
1037
+ CREATE TABLE analytic.tsk_bm2_route_hour_core (
1038
+ "name" text NOT NULL,
1039
+ datum date NOT NULL,
1040
+ hodina float8 NOT NULL,
1041
+ cas_interval text NOT NULL,
1042
+ avg_time numeric NULL,
1043
+ avg_speed numeric NULL,
1044
+ CONSTRAINT tsk_bm2_route_hour_core_pkey PRIMARY KEY (name, datum, hodina, cas_interval)
1045
+ );
1046
+ CREATE INDEX tsk_bm2_route_hour_core_date ON analytic.tsk_bm2_route_hour_core USING btree (datum);
1047
+
1048
+ CREATE TABLE analytic.tsk_bm2_data_all (
1049
+ "name" text NOT NULL,
1050
+ name_trasa text NOT NULL,
1051
+ name_usek text NOT NULL,
1052
+ smer text NOT NULL,
1053
+ datum date NOT NULL,
1054
+ cas_interval text NOT NULL,
1055
+ avg_time numeric NULL,
1056
+ avg_speed numeric NULL,
1057
+ normal_avg_time numeric NULL,
1058
+ normal_avg_speed numeric NULL
1059
+ );
1060
+ CREATE UNIQUE INDEX tsk_bm2_data_all_pkey ON analytic.tsk_bm2_data_all USING btree (name, name_trasa, name_usek, smer, datum, cas_interval);
1061
+
1062
+ CREATE OR REPLACE VIEW analytic.v_tsk_bm2_route
1063
+ AS SELECT DISTINCT ON ((wazett_routes.name::json ->> 'project'::text), (wazett_routes.name::json ->> 'route number'::text), (wazett_routes.name::json ->> 'dir'::text)) wazett_routes.id,
1064
+ concat(wazett_routes.name::json ->> 'route number'::text, ' ', wazett_routes.name::json ->> 'name'::text) AS name,
1065
+ true AS is_trasa,
1066
+ false AS is_usek,
1067
+ false AS is_opacny_smer,
1068
+ wazett_routes.name::json ->> 'name'::text AS name_trasa,
1069
+ "substring"(wazett_routes.name,
1070
+ CASE
1071
+ WHEN "position"(wazett_routes.name, ' ÚS'::text) > 0 THEN "position"(wazett_routes.name, ' ÚS'::text) + 4
1072
+ ELSE length(wazett_routes.name) + 1
1073
+ END,
1074
+ CASE
1075
+ WHEN "position"(wazett_routes.name, ' OS'::text) > 0 THEN "position"(wazett_routes.name, ' OS'::text) - "position"(wazett_routes.name, ' ÚS'::text) - 4
1076
+ ELSE length(wazett_routes.name) - "position"(wazett_routes.name, ' ÚS'::text)
1077
+ END) AS name_usek,
1078
+ st_astext(wazett_routes.line) AS line,
1079
+ concat('#', "left"(lpad(to_hex((wazett_routes.id::double precision * character_length(wazett_routes.name)::double precision / (( SELECT min(wazett_routes_1.id * character_length(wazett_routes_1.name)) AS min
1080
+ FROM wazett.wazett_routes wazett_routes_1))::double precision * 10000000::double precision)::bigint), 6, '0'::text), 6)) AS color
1081
+ FROM wazett.wazett_routes
1082
+ WHERE (wazett_routes.feed_id = ANY (ARRAY[9, 10])) AND wazett_routes.name ~~ '{%'::text AND (wazett_routes.name::json ->> 'project'::text) = 'TSK BM II'::text
1083
+ ORDER BY (wazett_routes.name::json ->> 'project'::text), (wazett_routes.name::json ->> 'route number'::text), (wazett_routes.name::json ->> 'dir'::text), wazett_routes.created_at DESC;
1084
+
1085
+
1086
+ CREATE MATERIALIZED VIEW analytic.mv_tsk_bm2_normal
1087
+ TABLESPACE pg_default
1088
+ AS SELECT vtbh.name,
1089
+ vtbh.hodina,
1090
+ round(avg(vtbh.avg_time), 2) AS avg_time,
1091
+ round(avg(vtbh.avg_speed)) AS avg_speed
1092
+ FROM ( SELECT rl.name,
1093
+ rl.ts::date AS datum,
1094
+ date_part('hour'::text, rl.ts) AS hodina,
1095
+ (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,
1096
+ rl.avg_time,
1097
+ rl.avg_speed
1098
+ FROM ( SELECT rl_1.route_id,
1099
+ vtbr.name,
1100
+ date_trunc('hour'::text, to_timestamp((rl_1.update_time / 1000)::double precision)) AS ts,
1101
+ round(avg(rl_1."time"), 2) AS avg_time,
1102
+ round(avg(rl_1.length * 1000 / (NULLIF(rl_1."time", 0) * 360)), 2) AS avg_speed
1103
+ FROM wazett.wazett_route_lives rl_1
1104
+ JOIN analytic.v_tsk_bm2_route vtbr ON vtbr.id = rl_1.route_id
1105
+ WHERE rl_1.update_time >= '1681516800000'::bigint
1106
+ GROUP BY vtbr.name, rl_1.route_id, (date_trunc('hour'::text, to_timestamp((rl_1.update_time / 1000)::double precision)))) rl) vtbh
1107
+ WHERE vtbh.datum >= '2023-04-15'::date AND vtbh.datum <= '2023-05-01'::date AND (date_part('dow'::text, vtbh.datum) = ANY (ARRAY[2::double precision, 3::double precision, 4::double precision]))
1108
+ GROUP BY vtbh.name, vtbh.hodina
1109
+ WITH DATA;
1110
+
1111
+ CREATE OR REPLACE PROCEDURE analytic.update_tsk_bm2()
1112
+ LANGUAGE plpgsql
1113
+ AS $procedure$
1114
+ declare
1115
+ lastupdatetimestamp timestamptz;
1116
+ lastupdateunix bigint;
1117
+ begin
1118
+ begin
1119
+ select
1120
+ case
1121
+ when start_day is not null
1122
+ then start_day
1123
+ else '2022-01-01'
1124
+ end as start_day_from into lastupdatetimestamp
1125
+ from (select max(datum)-interval '1 days' start_day from analytic.tsk_bm2_route_hour_core) malastranamax;
1126
+
1127
+ lastupdateunix := extract ('epoch' from lastupdatetimestamp) * 1000;
1128
+
1129
+ -- dopoctu hodinovou agregaci (podobné v_mala_strana_route_hour_core) POT5EBUJEME TAKTO?
1130
+ insert into analytic.tsk_bm2_route_hour_core
1131
+ SELECT
1132
+ wdrn.name,
1133
+ rl.ts::date AS datum,
1134
+ date_part('hour'::text, rl.ts) AS hodina,
1135
+ (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,
1136
+ avg_time,
1137
+ avg_speed
1138
+ FROM (
1139
+ select
1140
+ route_id
1141
+ -- timezone('Europe/Prague'::text, to_timestamp((update_time / 1000)::double precision)::timestamp without time zone)
1142
+ ,date_trunc('hour', to_timestamp((update_time / 1000))::timestamp) as ts
1143
+ ,round(avg(time), 2) AS avg_time
1144
+ ,round(avg(rl.length * 1000 / (nullif(rl."time", 0) * 360)), 2) AS avg_speed
1145
+ from wazett.wazett_route_lives rl
1146
+ where
1147
+ -- route_id = 22706 and
1148
+ rl.update_time > lastupdateunix and
1149
+ rl.length > 0
1150
+ group by 1,2) rl
1151
+ JOIN analytic.v_tsk_bm2_route wdrn ON wdrn.id = rl.route_id
1152
+ ON CONFLICT (name,datum,hodina,cas_interval)
1153
+ DO update
1154
+ SET avg_time = EXCLUDED.avg_time,
1155
+ avg_speed = EXCLUDED.avg_speed
1156
+ ;
1157
+
1158
+ insert into analytic.tsk_bm2_data_all
1159
+ WITH
1160
+ v_ms_route_hour as (
1161
+ SELECT p.name,
1162
+ p.datum,
1163
+ p.hodina,
1164
+ p.cas_interval,
1165
+ p.avg_time,
1166
+ p.avg_speed,
1167
+ n.avg_time AS normal_avg_time,
1168
+ n.avg_speed AS normal_avg_speed
1169
+ FROM analytic.tsk_bm2_route_hour_core p
1170
+ LEFT JOIN analytic.mv_tsk_bm2_normal n ON n.name = p.name AND p.hodina = n.hodina
1171
+ where datum > lastupdatetimestamp
1172
+ ),
1173
+ -- konec v_ms_route_hour
1174
+ v_ms_union_time_interval as (
1175
+ WITH hodiny AS (
1176
+ SELECT brh.name,
1177
+ brh.datum,
1178
+ brh.hodina,
1179
+ brh.cas_interval,
1180
+ brh.avg_time,
1181
+ brh.avg_speed,
1182
+ brh.normal_avg_time,
1183
+ brh.normal_avg_speed
1184
+ FROM v_ms_route_hour brh
1185
+ WHERE brh.datum < CURRENT_DATE OR brh.hodina < date_part('hour'::text, now())
1186
+ ), den AS (
1187
+ SELECT hodiny.name,
1188
+ hodiny.datum,
1189
+ '0 - 24h'::text AS cas_interval,
1190
+ round(avg(hodiny.avg_time), 2) AS avg_time,
1191
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
1192
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
1193
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
1194
+ FROM hodiny
1195
+ WHERE hodiny.datum < CURRENT_DATE
1196
+ GROUP BY hodiny.name, hodiny.datum
1197
+ ), h15_18 AS (
1198
+ SELECT hodiny.name,
1199
+ hodiny.datum,
1200
+ '15 -18'::text AS cas_interval,
1201
+ round(avg(hodiny.avg_time), 2) AS avg_time,
1202
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
1203
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
1204
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
1205
+ FROM hodiny
1206
+ WHERE hodiny.hodina >= 15::double precision AND hodiny.hodina <= 17::double precision AND (hodiny.datum < CURRENT_DATE OR hodiny.hodina > 17::double precision)
1207
+ GROUP BY hodiny.name, hodiny.datum
1208
+ ), h22_6 AS (
1209
+ SELECT hodiny.name,
1210
+ hodiny.datum,
1211
+ '22 - 06'::text AS cas_interval,
1212
+ round(avg(hodiny.avg_time), 2) AS avg_time,
1213
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
1214
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
1215
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
1216
+ FROM hodiny
1217
+ WHERE NOT (hodiny.hodina >= 6::double precision AND hodiny.hodina <= 21::double precision) AND hodiny.datum < CURRENT_DATE
1218
+ GROUP BY hodiny.name, hodiny.datum
1219
+ ), h6_22 AS (
1220
+ SELECT hodiny.name,
1221
+ hodiny.datum,
1222
+ '06 - 22'::text AS cas_interval,
1223
+ round(avg(hodiny.avg_time), 2) AS avg_time,
1224
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
1225
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
1226
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
1227
+ FROM hodiny
1228
+ WHERE hodiny.hodina >= 6::double precision AND hodiny.hodina <= 21::double precision AND (hodiny.datum < CURRENT_DATE OR hodiny.hodina > 21::double precision)
1229
+ GROUP BY hodiny.name, hodiny.datum
1230
+ ), h7_10 AS (
1231
+ SELECT hodiny.name,
1232
+ hodiny.datum,
1233
+ '07 - 10'::text AS cas_interval,
1234
+ round(avg(hodiny.avg_time), 2) AS avg_time,
1235
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
1236
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
1237
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
1238
+ FROM hodiny
1239
+ WHERE hodiny.hodina >= 7::double precision AND hodiny.hodina <= 9::double precision AND (hodiny.datum < CURRENT_DATE OR hodiny.hodina > 10::double precision)
1240
+ GROUP BY hodiny.name, hodiny.datum
1241
+ ), h7_11_15_19 AS (
1242
+ SELECT hodiny.name,
1243
+ hodiny.datum,
1244
+ '07 - 11, 15 - 19'::text AS cas_interval,
1245
+ round(avg(hodiny.avg_time), 2) AS avg_time,
1246
+ round(avg(hodiny.avg_speed), 2) AS avg_speed,
1247
+ round(avg(hodiny.normal_avg_time), 2) AS normal_avg_time,
1248
+ round(avg(hodiny.normal_avg_speed), 2) AS normal_avg_speed
1249
+ FROM hodiny
1250
+ 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)
1251
+ GROUP BY hodiny.name, hodiny.datum
1252
+ )
1253
+ SELECT hodiny.name,
1254
+ hodiny.datum,
1255
+ hodiny.cas_interval,
1256
+ hodiny.avg_time,
1257
+ hodiny.avg_speed,
1258
+ hodiny.normal_avg_time,
1259
+ hodiny.normal_avg_speed
1260
+ FROM hodiny
1261
+ UNION ALL
1262
+ SELECT den.name,
1263
+ den.datum,
1264
+ den.cas_interval,
1265
+ den.avg_time,
1266
+ den.avg_speed,
1267
+ den.normal_avg_time,
1268
+ den.normal_avg_speed
1269
+ FROM den
1270
+ UNION ALL
1271
+ SELECT h15_18.name,
1272
+ h15_18.datum,
1273
+ h15_18.cas_interval,
1274
+ h15_18.avg_time,
1275
+ h15_18.avg_speed,
1276
+ h15_18.normal_avg_time,
1277
+ h15_18.normal_avg_speed
1278
+ FROM h15_18
1279
+ UNION ALL
1280
+ SELECT h22_6.name,
1281
+ h22_6.datum,
1282
+ h22_6.cas_interval,
1283
+ h22_6.avg_time,
1284
+ h22_6.avg_speed,
1285
+ h22_6.normal_avg_time,
1286
+ h22_6.normal_avg_speed
1287
+ FROM h22_6
1288
+ UNION ALL
1289
+ SELECT h6_22.name,
1290
+ h6_22.datum,
1291
+ h6_22.cas_interval,
1292
+ h6_22.avg_time,
1293
+ h6_22.avg_speed,
1294
+ h6_22.normal_avg_time,
1295
+ h6_22.normal_avg_speed
1296
+ FROM h6_22
1297
+ UNION ALL
1298
+ SELECT h7_10.name,
1299
+ h7_10.datum,
1300
+ h7_10.cas_interval,
1301
+ h7_10.avg_time,
1302
+ h7_10.avg_speed,
1303
+ h7_10.normal_avg_time,
1304
+ h7_10.normal_avg_speed
1305
+ FROM h7_10
1306
+ UNION ALL
1307
+ SELECT h7_11_15_19.name,
1308
+ h7_11_15_19.datum,
1309
+ h7_11_15_19.cas_interval,
1310
+ h7_11_15_19.avg_time,
1311
+ h7_11_15_19.avg_speed,
1312
+ h7_11_15_19.normal_avg_time,
1313
+ h7_11_15_19.normal_avg_speed
1314
+ FROM h7_11_15_19
1315
+ ),
1316
+ -----------------------
1317
+ data1 AS (
1318
+ SELECT
1319
+ trasy.name,
1320
+ trasy.name_trasa,
1321
+ trasy.name_usek,
1322
+ CASE
1323
+ WHEN trasy.is_opacny_smer THEN 'Zpět'::text
1324
+ ELSE 'Tam'::text
1325
+ END AS smer,
1326
+ vbu.datum,
1327
+ vbu.cas_interval,
1328
+ vbu.avg_time,
1329
+ vbu.avg_speed,
1330
+ vbu.normal_avg_time,
1331
+ vbu.normal_avg_speed
1332
+ FROM v_ms_union_time_interval vbu
1333
+ JOIN analytic.v_tsk_bm2_route trasy ON trasy.name = vbu.name
1334
+ ),
1335
+ data2 AS (
1336
+ SELECT
1337
+ data1.name_trasa,
1338
+ data1.name_usek,
1339
+ 'Oba'::text AS smer,
1340
+ data1.datum,
1341
+ data1.cas_interval,
1342
+ sum(data1.avg_time) AS avg_time,
1343
+ avg(data1.avg_speed) AS avg_speed,
1344
+ sum(data1.normal_avg_time) AS normal_avg_time,
1345
+ avg(data1.normal_avg_speed) AS normal_avg_speed
1346
+ FROM data1
1347
+ GROUP BY data1.name_trasa, data1.name_usek, 'Oba'::text, data1.datum, data1.cas_interval
1348
+ )
1349
+ SELECT data1.name,
1350
+ data1.name_trasa,
1351
+ data1.name_usek,
1352
+ data1.smer,
1353
+ data1.datum,
1354
+ data1.cas_interval,
1355
+ data1.avg_time,
1356
+ data1.avg_speed,
1357
+ data1.normal_avg_time,
1358
+ data1.normal_avg_speed
1359
+ FROM data1
1360
+ UNION
1361
+ SELECT vbt.name,
1362
+ data2.name_trasa,
1363
+ data2.name_usek,
1364
+ data2.smer,
1365
+ data2.datum,
1366
+ data2.cas_interval,
1367
+ data2.avg_time,
1368
+ data2.avg_speed,
1369
+ data2.normal_avg_time,
1370
+ data2.normal_avg_speed
1371
+ FROM data2
1372
+ JOIN analytic.v_tsk_bm2_route vbt ON vbt.name_trasa = data2.name_trasa AND vbt.name_usek = data2.name_usek AND NOT vbt.is_opacny_smer
1373
+ on conflict (name,name_trasa,name_usek,smer,datum,cas_interval)
1374
+ do update
1375
+ SET avg_time = EXCLUDED.avg_time,
1376
+ avg_speed = EXCLUDED.avg_speed,
1377
+ normal_avg_time = EXCLUDED.normal_avg_time,
1378
+ normal_avg_speed = EXCLUDED.normal_avg_speed;
1379
+ end;
1380
+ end;
1381
+ $procedure$
1382
+ ;
1383
+
1384
+
1385
+ CREATE TABLE analytic.waze_route_travel_times_agg (
1386
+ route_id int8 NOT NULL,
1387
+ "year" float8 NOT NULL,
1388
+ "month" float8 NOT NULL,
1389
+ "day" float8 NOT NULL,
1390
+ dow float8 NOT NULL,
1391
+ "hour" float8 NOT NULL,
1392
+ quarter int4 NOT NULL,
1393
+ hour_quarter float8 NOT NULL,
1394
+ "date" timestamp NULL,
1395
+ travel_time int4 NULL,
1396
+ CONSTRAINT waze_route_travel_times_agg_pkey PRIMARY KEY (route_id, year, month, day, dow, hour, quarter, hour_quarter) INCLUDE (travel_time)
1397
+ );
1398
+
1399
+ CREATE OR REPLACE PROCEDURE analytic.update_waze()
1400
+ LANGUAGE plpgsql
1401
+ AS $procedure$
1402
+
1403
+ declare
1404
+ lastupdatetimestamp timestamptz;
1405
+ lastupdateunix bigint;
1406
+ begin
1407
+ select
1408
+ case
1409
+ when start_day is not null
1410
+ then start_day
1411
+ else '2021-01-01'
1412
+ end as start_day_from into lastupdatetimestamp
1413
+ from (select max(date)-interval '1 days' start_day from analytic.waze_route_travel_times_agg) wazemax;
1414
+
1415
+ lastupdateunix := extract ('epoch' from lastupdatetimestamp) * 1000;
1416
+ -- inserting data is incremental, since the last timestamp already in the table
1417
+ insert into analytic.waze_route_travel_times_agg
1418
+ SELECT ts.route_id,
1419
+ ts.year,
1420
+ ts.month,
1421
+ ts.day,
1422
+ ts.dow,
1423
+ ts.hour,
1424
+ ts.quarter,
1425
+ ts.hour + (ts.quarter::numeric / 60::numeric)::double precision AS hour_quarter,
1426
+ ((((((((ts.year || '-'::text) || ts.month) || '-'::text) || ts.day) || ' '::text) || ts.hour) || ':'::text) || ts.quarter)::timestamp without time zone AS date,
1427
+ avg(ts.travel_time)::integer AS travel_time
1428
+ FROM ( SELECT raw.route_id,
1429
+ raw.update_time,
1430
+ raw.travel_time,
1431
+ date_part('year'::text, raw.update_time) AS year,
1432
+ date_part('month'::text, raw.update_time) AS month,
1433
+ date_part('day'::text, raw.update_time) AS day,
1434
+ date_part('dow'::text, raw.update_time) AS dow,
1435
+ date_part('hour'::text, raw.update_time) AS hour,
1436
+ date_part('minute'::text, raw.update_time) AS minute,
1437
+ date_part('minute'::text, raw.update_time)::integer / 15 * 15 AS quarter
1438
+ FROM ( SELECT wazett_route_lives.route_id,
1439
+ timezone('Europe/Prague'::text, to_timestamp((wazett_route_lives.update_time / 1000)::double precision)::timestamp without time zone) AS update_time,
1440
+ wazett_route_lives."time" AS travel_time
1441
+ FROM wazett.wazett_route_lives
1442
+ JOIN analytic.waze_dashboard_route_name wdrn ON wdrn.route_id = wazett_route_lives.route_id
1443
+ where wazett_route_lives.update_time > lastupdateunix -- this is the time condition for the increment
1444
+ ) raw
1445
+ ) ts
1446
+ WHERE ts.year > 2000::double precision
1447
+ GROUP BY ts.route_id, ts.year, ts.month, ts.day, ts.dow, ts.hour, ts.quarter
1448
+ ON CONFLICT (route_id, year, month, day, dow, hour, quarter, hour_quarter)
1449
+ DO update
1450
+ SET
1451
+ date = EXCLUDED.date,
1452
+ travel_time = EXCLUDED.travel_time
1453
+ ;
1454
+ end;
1455
+ $procedure$
1456
+ ;
1457
+