Как определить, что дата включена в определенный месяц и присоединиться к таблицам? - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть первая таблица, в которой хранится почасовая информация о состоянии объекта.

| TIME_KEY            | ID_OBJECT | STATUS |
|---------------------|-----------|--------|
| 2018-01-01 00:00:00 | 1         | IN     |
| 2018-01-01 00:00:00 | 2         | OUT    |
| 2018-01-01 01:00:00 | 1         | OUT    |
| 2018-01-01 01:00:00 | 2         | IN     |
| 2018-02-01 00:00:00 | 1         | IN     |
| 2018-02-01 00:00:00 | 2         | OUT    |
| 2018-02-01 01:00:00 | 1         | OUT    |
| 2018-02-01 01:00:00 | 2         | IN     |

Во второй таблице хранится кодовое имя объекта за определенный месяц.

| MONTH_KEY           | SITE_ID   | NAME       |
|---------------------|-----------|------------|
| 2018-01-01          | 1         | Apple      |
| 2018-01-01          | 2         | HP         |
| 2018-02-01          | 1         | Samsung    |
| 2018-02-01          | 2         | Blackberry |

Как правильно объединить эти две таблицы и вернуть такой результат?

| TIME_KEY            | ID_OBJECT | STATUS | NAME       |
|---------------------|-----------|--------|------------|
| 2018-01-01 00:00:00 | 1         | IN     | Apple      |
| 2018-01-01 00:00:00 | 2         | OUT    | HP         |
| 2018-01-01 01:00:00 | 1         | OUT    | Apple      |
| 2018-01-01 01:00:00 | 2         | IN     | HP         |
| 2018-02-01 00:00:00 | 1         | IN     | Samsung    |
| 2018-02-01 00:00:00 | 2         | OUT    | Blackberry |
| 2018-02-01 01:00:00 | 1         | OUT    | Samsung    |
| 2018-02-01 01:00:00 | 2         | IN     | Blackberry |

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

вы можете конвертировать дату в месяц и можете присоединиться

 select t2.TIME_KEY,t1.ID_OBJECT,STATUS,NAME        
 FROM table1 t1 JOIN
 table2 t2 on month(t1.TIME_KEY)=month(t2.TIME_KEY)  and t1.ID_OBJECT=t2.SITE_ID            
0 голосов
/ 08 февраля 2019

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

select t1.*,
       (select t2.name
        from table2 t2
        where t2.site_id = t1.object_id and
              t1.time_key >= t2.month_key
        order by t2.month_key desc
        limit 1
       ) as name
from table1 t1;

Это займет самое последнее имя , даже если оно не в текущем месяце.Я предполагаю, что это желательное поведение.

0 голосов
/ 08 февраля 2019

Вам нужно JOIN & разговоров:

SELECT T1.TIME_KEY, T1.ID_OBJECT, T1.STATUS, T2.NAME
FROM table1 T1 INNER JOIN
     table2 T2
     ON T1.ID_OBJECT = T2.SITE_ID AND 
        CAST(T2.MONTH_KEY  AS DATE) = CAST(T1.TIME_KEY AS DATE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...