Объединить две таблицы с временным интервалом, используя каждую строку только один раз - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь объединить две таблицы в Postgres, которые имеют несколько разные временные метки. Данные имеют определенный шаблон

Таблица 1 может выглядеть следующим образом:

Table 1
number     timestamp
2          2016-11-14 12:01:55
2          2016-11-14 12:01:57
2          2016-11-14 12:05:55
2          2016-11-14 12:05:57
2          2016-11-14 12:09:55
2          2016-11-14 12:09:57      
Table 2
number     timestamp
2          2016-11-14 12:01:45
2          2016-11-14 12:01:47
2          2016-11-14 12:05:45
2          2016-11-14 12:05:47
2          2016-11-14 12:09:45
2          2016-11-14 12:09:47      

Я могу объединить их на основе ближайшей отметки времени, например:

Table merged
number     timestamp1                 timestamp2          
2          2016-11-14 12:01:55        2016-11-14 12:01:47
2          2016-11-14 12:01:57        2016-11-14 12:01:47
2          2016-11-14 12:05:55        2016-11-14 12:05:47
2          2016-11-14 12:05:57        2016-11-14 12:05:47
2          2016-11-14 12:09:55        2016-11-14 12:09:47 
2          2016-11-14 12:09:57        2016-11-14 12:09:47 

Однако теперь одна строка используется несколько раз во время соединения. Я хотел бы использовать каждую строку только один раз при объединении, чтобы моя объединенная таблица выглядела следующим образом:

Table merged
number     timestamp1                 timestamp2          
2          2016-11-14 12:01:55        2016-11-14 12:01:45
2          2016-11-14 12:01:57        2016-11-14 12:01:47
2          2016-11-14 12:05:55        2016-11-14 12:05:45
2          2016-11-14 12:05:57        2016-11-14 12:05:47
2          2016-11-14 12:09:55        2016-11-14 12:09:45 
2          2016-11-14 12:09:57        2016-11-14 12:09:47 

Есть идеи, как мне этого добиться в Postgresql? Это мой текущий код. Я не знаком с Postgres, поэтому он может быть немного грязным

select DISTINCT ON (timestamp1) *
from
( select * from(  
                    select 
                    number, timestamp1
                    from table1) as tmp_t1
                    LEFT JOIN
                        (select *
                        from
                        (select 
                        number, timestamp2
                        from table2
                        ) as tmp2
                        )
                        as foo on foo.number=tmp_t1.number  
                                                    where timestamp2 BETWEEN timestamp1  
                                                    AND timestamp1 + interval '10 sec') as table_merged
...