Просто подумал еще немного - и есть другой способ, также Vertica, указывающий c, чтобы решить вашу проблему.
Это еще один временной ряд, связанный с ie в СУБД: Event Series Join . Он работает со всеми внешними объединениями, объединяя текущую строку со строкой другой таблицы либо с совпадающим столбцом соединения (с предикатом INTERPOLATE PREVIOUS VALUE
), либо со строкой с непосредственно предшествующим значением в столбце соединения.
Вы можете объединить несколько предикатов, но только один предикат может быть INTERPOLATE PREVIOUS VALUE
.
В вашем случае, если возможно, что предыдущая строка, которую вы ищете, также имеет другую дату, а не только другое время, вы должны добавить столбец: ts TIMESTAMP DEFAULT dt+tm::INTERVAL
в базовую таблицу, и INTERPOLATE PREVIOUS VALUE
на этом.
Мой пример ленив и предполагает, что вы можете найти совпадение только по времени.
WITH
input(id1,id2,txt,val,dt,tm) AS (
SELECT 1,1,'jane' ,97,DATE'2020-01-01','05:30:22'::TIME
UNION ALL SELECT 1,1,'henry' ,54,DATE'2020-01-01','06:30:22'::TIME
UNION ALL SELECT 1,1,'jane' ,10,DATE'2020-01-01','07:30:22'::TIME
UNION ALL SELECT 1,1,'jack' , 2,DATE'2020-01-01','08:30:22'::TIME
UNION ALL SELECT 1,1,'settle' ,30,DATE'2020-01-01','09:30:22'::TIME
UNION ALL SELECT 1,1,'kara' ,16,DATE'2020-01-01','10:30:22'::TIME
UNION ALL SELECT 1,1,'sam' ,46,DATE'2020-07-01','11:30:22'::TIME
UNION ALL SELECT 1,1,'pam' ,14,DATE'2020-07-01','12:30:22'::TIME
UNION ALL SELECT 1,1,'settle' ,27,DATE'2020-07-01','13:30:22'::TIME
UNION ALL SELECT 1,1,'michael',90,DATE'2020-07-01','14:30:22'::TIME
UNION ALL SELECT 1,1,'tom' ,10,DATE'2020-07-01','15:30:22'::TIME
UNION ALL SELECT 1,1,'jackson',20,DATE'2020-07-01','16:30:22'::TIME
UNION ALL SELECT 1,1,'settle' ,40,DATE'2020-07-01','17:30:22'::TIME
)
,
orig_rows AS (
SELECT
*
FROM input
WHERE txt IN('jane','pam','tom')
)
SELECT
input.id1
, input.id2
, input.txt
, input.val
, input.dt
, input.dt + input.tm::interval AS ts
, orig_rows.txt AS value2
, orig_rows.val AS value_orig
FROM input
LEFT JOIN orig_rows
ON input.id1=orig_rows.id1
AND input.id2=orig_rows.id2
AND input.dt = orig_rows.dt
AND input.tm INTERPOLATE PREVIOUS VALUE orig_rows.tm
WHERE input.txt='settle'
;
-- out id1 | id2 | txt | val | dt | ts | value2 | value_orig
-- out -----+-----+--------+-----+------------+---------------------+--------+------------
-- out 1 | 1 | settle | 30 | 2020-01-01 | 2020-01-01 09:30:22 | jane | 10
-- out 1 | 1 | settle | 27 | 2020-07-01 | 2020-07-01 13:30:22 | pam | 14
-- out 1 | 1 | settle | 40 | 2020-07-01 | 2020-07-01 17:30:22 | tom | 10
-- out (3 rows)
-- out
-- out Time: First fetch (3 rows): 90.260 ms. All rows formatted: 90.301 ms
счастливая игра, снова ...