Как объединить две таблицы в postgresql для столбцов datetime, и все регистры datetime отображаются в одном столбце? - PullRequest
0 голосов
/ 23 октября 2019

У меня есть две таблицы:

TABLE_MACHINE_1

datetime,            sensor_1
2017-10-01 21:00:00, 1.18047
2017-10-01 21:15:00, 1.18023
2017-10-01 21:30:00, 1.18059
2017-10-01 21:45:00, 1.18067
2017-10-01 22:00:00, 1.18056
2017-10-01 22:15:00, 1.18147
2017-10-01 22:30:00, 1.18104
2017-10-01 22:45:00, 1.18111
2017-10-01 23:00:00, 1.18103
2017-10-01 23:15:00, 1.18072
2017-10-01 23:30:00, 1.18083
2017-10-01 23:45:00, 1.18079
2017-10-02 00:00:00, 1.17996
2017-10-02 00:15:00, 1.17987
2017-10-02 00:30:00, 1.17968
2017-10-02 00:45:00, 1.17893
2017-10-02 01:00:00, 1.17852
2017-10-02 01:15:00, 1.17833

TABLE_MACHINE_2

datetime,            sensor_2
2017-10-01 21:45:00, 112.1
2017-10-01 22:00:00, 133.2
2017-10-01 22:15:00, 143.5
2017-10-01 22:30:00, 154.9
2017-10-01 22:45:00, 166.1
2017-10-01 23:30:00, 123.1
2017-10-01 23:45:00, 134.1
2017-10-02 00:00:00, 188.3
2017-10-02 01:00:00, 192.9
2017-10-02 01:15:00, 105.3
2017-10-02 01:30:00, 172.9
2017-10-02 01:45:00, 145.3
2017-10-02 02:00:00, 174.9
2017-10-02 02:15:00, 155.3

и я ожидал, как получится:

ПРИСОЕДИНЯЙТЕСЬ К ОЖИДАНУ

datetime,            sensor_1  sensor_2
2017-10-01 21:00:00, 1.18047,  NULL
2017-10-01 21:15:00, 1.18023,  NULL
2017-10-01 21:30:00, 1.18059,  NULL
2017-10-01 21:45:00, 1.18067,  112.1
2017-10-01 22:00:00, 1.18056,  133.2
2017-10-01 22:15:00, 1.18147,  143.5
2017-10-01 22:30:00, 1.18104,  154.9
2017-10-01 22:45:00, 1.18111,  166.1
2017-10-01 23:00:00, 1.18103,  NULL
2017-10-01 23:15:00, 1.18072,  NULL
2017-10-01 23:30:00, 1.18083,  123.1
2017-10-01 23:45:00, 1.18079,  134.1
2017-10-02 00:00:00, 1.17996,  188.3
2017-10-02 00:15:00, 1.17987,  105.3
2017-10-02 00:30:00, 1.17968,  NULL
2017-10-02 00:45:00, 1.17893,  NULL
2017-10-02 01:00:00, 1.17852,  NULL
2017-10-02 01:15:00, 1.17833,  NULL
2017-10-02 01:30:00, NULL   ,  172.9
2017-10-02 01:45:00, NULL   ,  145.3
2017-10-02 02:00:00, NULL   ,  174.9
2017-10-02 02:15:00, NULL   ,  155.3

но если я сделаю FULL OUTER JOIN, получим:

FROM TABLE_MACHINE_1 FULL OUTER JOIN TABLE_MACHINE_2 ON DATETIME

datetime,            sensor_1, datetime,            sensor_2
2017-10-01 21:00:00, 1.18047,  NULL,                NULL  
2017-10-01 21:15:00, 1.18023,  NULL,                NULL 
2017-10-01 21:30:00, 1.18059,  NULL,                NULL 
2017-10-01 21:45:00, 1.18067,  2017-10-01 21:45:00, 112.1
2017-10-01 22:00:00, 1.18056,  2017-10-01 22:00:00, 133.2
2017-10-01 22:15:00, 1.18147,  2017-10-01 22:15:00, 143.5
2017-10-01 22:30:00, 1.18104,  2017-10-01 22:30:00, 154.9
2017-10-01 22:45:00, 1.18111,  2017-10-01 22:45:00, 166.1
2017-10-01 23:00:00, 1.18103,  NULL,                NULL 
2017-10-01 23:15:00, 1.18072,  NULL,                NULL 
2017-10-01 23:30:00, 1.18083,  2017-10-01 23:30:00, 123.1
2017-10-01 23:45:00, 1.18079,  2017-10-01 23:45:00, 134.1
2017-10-02 00:00:00, 1.17996,  2017-10-02 00:00:00, 188.3
2017-10-02 00:15:00, 1.17987,  NULL,                NULL 
2017-10-02 00:30:00, 1.17968,  NULL,                NULL 
2017-10-02 00:45:00, 1.17893,  NULL,                NULL 
2017-10-02 01:00:00, 1.17852,  2017-10-02 01:00:00, 192.9
2017-10-02 01:15:00, 1.17833,  2017-10-02 01:15:00, 105.3
NULL,                NULL,     2017-10-02 01:30:00, 172.9 
NULL,                NULL,     2017-10-02 01:45:00, 145.3
NULL,                NULL,     2017-10-02 02:00:00, 174.9 
NULL,                NULL,     2017-10-02 02:15:00, 155.3

Мне нужно решить это одним запросом в postgresqlи я попытался с полным отсутствием предложения внешнего соединения.

Я думал о следующем решении, но не могу реализовать его, потому что получаю ошибку, когда передаю переменную «generate_series»:

  1. Создайте одну переменную для хранения максимального дня каждой таблицы.

      datetime_end := to_char(now()::date,'YYY-MM-DD');
    
  2. Передайте переменную следующему запросу:

      SELECT generate_series(
          timestamp without time zone '2017-10-01',
          timestamp without time zone datetime_end,
          '15 minute');
    
  3. Чтобы выполнить LEFT, присоедините запрос к двум таблицам ранее.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 24 октября 2019

FROM TABLE_MACHINE_1 FULL OUTER JOIN TABLE_MACHINE_2 ON DATETIME

Это недопустимый SQL.

Если вы выполняете объединение с USING, а не ON,тогда он автоматически объединит столбцы.

select 
    datetime,
    t1.sensor_1,
    t2.sensor_2
from table_machine_1 t1
full outer join table_machine_2 t2 
    USING (datetime)
1 голос
/ 23 октября 2019

Вы хотите full outer join и coalesce():

select 
    coalesce(t1.datetime, t2.datetime) datetime,
    t1.sensor_1,
    t2.sensor_2
from table_machine_1 t1
full outer join table_machine_2 t2 
    on t1.datetime = t2.datetime

Демонстрация на DB Fiddle :

| datetime            | sensor_1 | sensor_2 |
| ------------------- | -------- | -------- |
| 2017-10-01 21:00:00 | 1.18047  |          |
| 2017-10-01 21:15:00 | 1.18023  |          |
| 2017-10-01 21:30:00 | 1.18059  |          |
| 2017-10-01 21:45:00 | 1.18067  | 112.1    |
| 2017-10-01 22:00:00 | 1.18056  | 133.2    |
| 2017-10-01 22:15:00 | 1.18147  | 143.5    |
| 2017-10-01 22:30:00 | 1.18104  | 154.9    |
| 2017-10-01 22:45:00 | 1.18111  | 166.1    |
| 2017-10-01 23:00:00 | 1.18103  |          |
| 2017-10-01 23:15:00 | 1.18072  |          |
| 2017-10-01 23:30:00 | 1.18083  | 123.1    |
| 2017-10-01 23:45:00 | 1.18079  | 134.1    |
| 2017-10-02 00:00:00 | 1.17996  | 188.3    |
| 2017-10-02 00:15:00 | 1.17987  |          |
| 2017-10-02 00:30:00 | 1.17968  |          |
| 2017-10-02 00:45:00 | 1.17893  |          |
| 2017-10-02 01:00:00 | 1.17852  | 192.9    |
| 2017-10-02 01:15:00 | 1.17833  | 105.3    |
| 2017-10-02 02:00:00 |          | 174.9    |
| 2017-10-02 01:30:00 |          | 172.9    |
| 2017-10-02 01:45:00 |          | 145.3    |
| 2017-10-02 02:15:00 |          | 155.3    |
...