Соедините две таблицы на основе временных меток с 5-минутным интервалом друг от друга - PullRequest
0 голосов
/ 26 апреля 2018

Я хочу объединить две таблицы на основе метки времени, проблема в том, что я заметил, что обе таблицы не имели одинаковую метку времени, поэтому я хочу объединить их, используя ближайшую метку времени с интервалом в 5 минут.

 Freezer |       Timestamp      | Temperature_1
     1      2018-04-25 09:45:00       10  
     1      2018-04-25 09:50:00       11   
     1      2018-04-25 09:55:00       11


Freezer |       Timestamp      | Temperature_2
     1      2018-04-25 09:46:00       15  
     1      2018-04-25 09:52:00       13   
     1      2018-04-25 09:59:00       12   

Мой желаемый результат будет:

Freezer |       Timestamp      | Temperature_1 | Temperature_2
     1      2018-04-25 09:45:00       10             15
     1      2018-04-25 09:50:00       11             13
     1      2018-04-25 09:55:00       11             12

Текущий запрос, над которым я работаю:

SELECT A.Freezer, A.Timestamp, Temperature_1,Temperature_2 From TABLE_A as A
RIGHT JOIN TABLE_B as B
ON A.FREEZER = B.FREEZER
WHERE A.Timestamp = B.Timestamp (this of course doesn't work because timestamps aren't the same)

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Попробуйте этот запрос

SELECT T1.freezer, 
       T1.[timestamp], 
       T1.temperature_1, 
       T2.temperature_2 
FROM   table_1 T1
       INNER JOIN table_2 T2
       ON T1.[timestamp] = Dateadd(minute, -(Cast(Datepart(minute, T2.[timestamp]) AS INT) % 5), T2.[timestamp]) 

Результат

+---------+-------------------------+---------------+---------------+
| Freezer |        Timestamp        | Temperature_1 | Temperature_2 |
+---------+-------------------------+---------------+---------------+
|       1 | 2018-04-25 09:45:00.000 |            10 |            15 |
|       1 | 2018-04-25 09:50:00.000 |            11 |            13 |
|       1 | 2018-04-25 09:55:00.000 |            11 |            12 |
+---------+-------------------------+---------------+---------------+

Демо: http://www.sqlfiddle.com/#!18/ffa1e/2/0

0 голосов
/ 26 апреля 2018

Делает ли это то, что вы хотите?

SELECT . . .
From TABLE_A A JOIN
     TABLE_B B
     ON A.FREEZER = B.FREEZER AND
        A.Timestamp >= DATEADD(minute, -5, B.TimeStamp) AND
        A.Timestamp <= DATEADD(minute, 5, B.TimeStamp) ;

Я не вижу причин для внешнего JOIN.

Если вы хотите найти ближайшую метку времени, тогда используйте apply:

select . . .
from table_a a cross apply
     (select top (1) b.*
      from table_b b
      where a.freezer = b.freezer 
      order by abs(datediff(second, a.timestamp, b.timestamp))
     ) b;

Вы можете добавить предложение where в подзапрос, чтобы ограничить диапазон совпадений пятью минутами.

...