【问题标题】:Join tables with dates within intervals of 5 min (get avg)加入日期间隔为 5 分钟的表(获取平均值)
【发布时间】:2018-10-07 13:14:27
【问题描述】:

我想根据时间戳加入两个表,问题是两个表没有完全相同的时间戳,所以我想使用接近时间戳和 5 分钟间隔加入它们。

这个查询需要使用2个Common table expressions来完成,每个公用表表达式都需要通过AVG得到timestampsgroup them这样才能匹配

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

我正在处理的当前查询是:

WITH Temperatures_1 (
SELECT Freezer, Temperature_1, Timestamp
FROM TABLE_A
),

WITH Temperatures_2 (
SELECT Freezer, Temperature_2, Timestamp
FROM TABLE_B
)

SELECT A.Freezer, A.Timestamp, Temperature_1, Temperature_2
FROM Temperatures_1 as A
RIGHT JOIN Temperatures_2 as B
ON A.FREEZER = B.FREEZER
WHERE A.Timestamp = B.Timestamp 

【问题讨论】:

  • 在询问编程问题时请注意您选择的词语。您要求使用“使用 5 分钟间隔的最近时间戳”。然后你说你希望“9:59”加入“9:55”,而“9:59”的最近 5 分钟间隔实际上是“10:00”。请重新措辞您的问题,以准确说明您要达到的目标。我什至不想考虑“按 AVG 对它们进行分组以便它们可以匹配”可能意味着什么。这根本没有意义。
  • 这与您之前标记为已回答的问题有何不同?
  • 是的,这是一个不同的问题,在上一个问题中我只想得到间隔,现在我正在做 2 个不同的 CTE,我想使用 AVG 功能
  • 您在哪里尝试使用 AVG,您遇到了什么错误?你想 AVG 做什么?

标签: sql sql-server group-by timestamp average


【解决方案1】:

您应该通过添加时间戳来更改连接两个表的键。您应该需要的时间戳来近似两个边表 A 和 B 表上的日期时间。 首先,您应该检查左表 (A) 日期时间的值是否低于 2.5 分钟,然后接近 5 分钟。如果它更大,则大约为接下来的 5 分钟。你应该在右表 (B) 上做同样的事情。或者您可以在 CTE 上执行此操作,并且右连接与您的查询保持相同。

【讨论】:

    【解决方案2】:

    您可能需要修改连接条件,而不是过滤输出。使用BETWEEN 将您的连接值括在时间戳上。我选择了 +/- 150 秒,因为这是两边 2-1/2 分钟的一半(匹配的 5 分钟范围)。你可能需要一些不同的东西。

    ;WITH Temperatures_1 (
    SELECT Freezer, Temperature_1, Timestamp
    FROM TABLE_A
    ),
    
    WITH Temperatures_2 (
    SELECT Freezer, Temperature_2, Timestamp
    FROM TABLE_B
    )
    
    SELECT A.Freezer, A.Timestamp, Temperature_1, Temperature_2
    FROM Temperatures_1 as A
    RIGHT JOIN Temperatures_2 as B
    ON A.FREEZER = B.FREEZER 
        AND A.Timestamp BETWEEN (DATEADD(SECOND, -150, B.Timestamp) 
                                AND (DATEADD(SECOND, 150, B.Timestamp)
    

    【讨论】:

      猜你喜欢
      • 2014-01-26
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多