Объединить таблицы с ближайшей отметкой времени - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть две таблицы, которые мне нужно объединить с ближайшей временной меткой, но я не могу найти способ сделать это просто в SQL.

Пример данных:

table_1
+---------------------+------+
|      timestamp      | name |
+---------------------+------+
| 2020-02-11 14:50:00 | xxx  |
| 2020-02-11 14:51:00 | yyy  |
| 2020-02-11 14:52:00 | zzz  |
+---------------------+------+
table_2
+---------------------+-------+
|      timestamp      | value |
+---------------------+-------+
| 2020-02-11 14:49:50 |     1 |
| 2020-02-11 14:49:58 |     2 |
| 2020-02-11 14:49:59 |     3 |
| 2020-02-11 14:50:50 |    11 |
| 2020-02-11 14:50:58 |    12 |
| 2020-02-11 14:50:59 |    13 |
| 2020-02-11 14:51:50 |    21 |
| 2020-02-11 14:51:58 |    22 |
| 2020-02-11 14:51:59 |    23 |
+---------------------+-------+

Мне нужно получить table_1, оставленное объединением table_2 с ближайшей отметкой времени, при условии, что отметка времени в table_2 всегда немного меньше, чем отметка в table_1 , С этой логикой c я ожидаю получить эту таблицу результатов.

expected result
+---------------------+------+-------+
|      timestamp      | name | value |
+---------------------+------+-------+
| 2020-02-11 14:50:00 | xxx  |     3 |
| 2020-02-11 14:51:00 | yyy  |    13 |
| 2020-02-11 14:52:00 | zzz  |    23 |
+---------------------+------+-------+

Могу ли я сделать это с помощью запроса SQL, даже если он может быть неэффективным? В противном случае, я думаю о загрузке данных в спарк-фрейм. У нас есть такой алгоритм реализован в спарк?

Спасибо

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

Если вам нужен только value из table_2, я бы воспользовался ответом Гордона. Но если вам нужно выбрать больше столбцов, я бы использовал коррелированный подзапрос в предложении LEFT JOINs ON:

select t1.timestamp, t1.name, t2.value
from table_1 t1
left join table_2 t2 on t2.timestamp = (
  select max(t2i.timestamp)
  from table_2 t2i
  where t2i.timestamp <= t1.timestamp
)

Результат:

| timestamp           | name | value |
| ------------------- | ---- | ----- |
| 2020-02-11 14:50:00 | xxx  | 3     |
| 2020-02-11 14:51:00 | yyy  | 13    |
| 2020-02-11 14:52:00 | zzz  | 23    |

Просмотр в БД Fiddle

0 голосов
/ 11 февраля 2020

Вы можете использовать коррелированный подзапрос:

select t1.*,
       (select t2.value
        from table_2 t2
        where t2.timestamp <= t1.timestamp
        order by t2.timestamp desc
        limit 1
       ) as t2_value
from table_1 t1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...