【问题标题】:Join two tables based on timestamps with a 5 minute interval from each other根据彼此间隔 5 分钟的时间戳连接两个表
【发布时间】:2018-10-06 12:10:12
【问题描述】:

我想根据时间戳加入两个表,问题是我注意到两个表没有完全相同的时间戳,所以我想使用最近的时间戳以 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)

【问题讨论】:

    标签: sql sql-server join timestamp


    【解决方案1】:

    这是你想要的吗?

    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 子句,以将匹配范围限制为五分钟。

    【讨论】:

      【解决方案2】:

      试试这个查询

      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

      【讨论】:

        猜你喜欢
        • 2020-04-03
        • 1970-01-01
        • 2020-03-22
        • 1970-01-01
        • 1970-01-01
        • 2018-05-15
        • 2020-07-06
        • 1970-01-01
        • 2021-05-12
        相关资源
        最近更新 更多