SQL: объединить две таблицы вокруг отметки времени - PullRequest
0 голосов
/ 23 мая 2018

У меня есть две таблицы с данными датчиков, и я хочу объединить обе таблицы в одну.

Таблица 1:

Sensor1 | Timestamp
34        2018-22-05 23:23:34
25        2018-22-05 22:23:23
51        2019-22-05 12:34:56

Таблица 2:

Sensor2 | Timestamp
27        2018-22-05 23:37:33
29        2018-22-05 22:36:47
66        2019-22-05 12:34:56

И мой желаемый результат:

Ожидаемая таблица:

Sensor1 | Sensor2 | Timestamp
          27        2018-22-05 23:37:33
34                  2018-22-05 23:23:34
          29        2018-22-05 22:36:47
25                  2018-22-05 22:23:23
51        66        2019-22-05 12:34:56

Маловероятно, что у нас может быть одинаковая временная метка в обеих таблицах, но даже если мы это сделаем, это не должно бытьпроблема иметь значения в обоих столбцах датчика.

Я пробовал использовать UNION, UNION ALL, OUTER JOIN, но я всегда получаю два столбца временных меток.

У кого-нибудь есть идея?

Спасибо и всего наилучшего, Родриго.

Ответы [ 4 ]

0 голосов
/ 24 мая 2018

В зависимости от того, какой вариант SQL вы используете, самым простым способом для этого может быть использование FULL OUTER JOIN , что-то вроде этого;

select
    t1.Sensor1,
    t2.Sensor2,
    coalesce(t1.Timestamp, t2.Timestamp) as Timestamp
from 
    table1 t1 full outer join table2 t2 on t2.Timestamp = t1.Timestamp
0 голосов
/ 24 мая 2018

Вы можете попробовать этот запрос.

просто используйте UNION ALL, чтобы объединить две таблицы.

  • Table1 установить Sensor2 столбец будет NULL
  • Table2 установить Sensor1 столбец будет NULL

затем заказатьTimestamp

SELECT * FROM (
select Sensor1 'Sensor1',null 'Sensor2',Ti from T 
UNION ALL 
select null 'Sensor1', Sensor1 'Sensor2',Ti from T2 
) t
order by ti desc

sqlfiddle: http://sqlfiddle.com/#!9/fb22b/9

ВЫХОД

| Sensor1 | Sensor2 |                   Ti |
|---------|---------|----------------------|
|  (null) |      27 | 2018-05-22T23:37:33Z |
|      34 |  (null) | 2018-05-22T23:23:34Z |
|  (null) |      29 | 2018-05-22T22:36:47Z |
|      25 |  (null) | 2018-05-22T22:23:23Z |

, если вы хотите разрешить NULL быть пустой строкой.Вы можете использовать функцию coalesce.

SELECT coalesce(Sensor1,'') as 'Sensor1',
       coalesce(Sensor2,'') as 'Sensor2',
       ti
FROM (
select Sensor1 'Sensor1',null 'Sensor2',Ti from T 
UNION ALL 
select null 'Sensor1', Sensor1 'Sensor2',Ti from T2 
) t
order by ti desc
0 голосов
/ 24 мая 2018

Если в таблице нет дубликатов, и вы хотите объединить результаты из обеих таблиц, я бы предложил агрегирование:

select max(sensor1) as sensor1, max(sensor2) as sensor2, timestamp
from ((select Sensor1, null as Sensor2, timestamp from t1
      ) union all
      (select null, Sensor2, timestamp
       from t2
      )
     ) t
group by timetamp
order by timestamp desc;
0 голосов
/ 23 мая 2018
select * from (
  select sensor1, null as sensor2, timestamp from table1
    where timestamp not in (select timestamp from table2)
  union all
  select null, sensor2, timestamp from table2
    where timestamp not in (select timestamp from table1)
  union all
  select t1.sensor1, t2.sensor2, t1.timestamp from table1 t1
    join table2 t2 on t1.timestamp = t2.timestamp
  ) a
order by timestamp;
...