SQL - 如何连接类似(非精确)列

时间:2010-05-11 20:18:16

标签: sql tsql join aggregate

我有两个表在几乎完全相同的时间更新 - 我需要加入datetime列。

我试过这个:

SELECT *
FROM A, B
WHERE ABS(DATEDIFF(second, A.Date_Time, B.Date_Time)) = (
    SELECT MIN(ABS(DATEDIFF(second, A.Date_Time, B2.Date_Time)))
    FROM B AS B2
)

但它告诉我:

  

在包含外部引用的聚合表达式中指定了多个列。如果聚合的表达式包含外部引用,则该外部引用必须是表达式中引用的唯一列。

我如何加入这些表?

3 个答案:

答案 0 :(得分:4)

如何(假设SQL 2005+):

With RankedItems As
    (
    Select A.DateTime As ADateTime, B.DateTime As BDateTime
        , ROW_NUMBER() OVER ( PARTITION BY A.DateTime ORDER BY ABS( DateDiff(s, A.DateTime, B.DateTime) ) ) As ItemRank
    From A
        Cross Join B
    )
Select 
From RankedItems
Where ItemRank = 1

在我的解决方案中,我使用的是公用表表达式或简称CTE。在CTE中,我使用排序函数(ROW_NUMBER)来计算CTE表达式中的每一行。 ROW_NUMBER函数将返回通过DateTime子句为表A中的每个PARTITION BY A.DateTime值提供一个连续整数,该子句由“closeness”A.DateTime值的绝对值排序到B.DateTime值。Abs(DateDiff(s,A.DateTime, B.DateTime)因此,我使用A.DateTime对“接近度”进行排名,并为每个ROW_NUMBER()值选择最高等级(等级= 1,又称“最接近”值)。如果存在平局则无关紧要,因为A.DateTime函数将为每个{{1}}值返回唯一的数字列表。

答案 1 :(得分:3)

这是你想要的吗?它将检查1秒差异

    select * from
A, b --use a join next time
where   A.Date_Time 
between DATEADD(s,-1,B.Date_Time) and DATEADD(s,1,B.Date_Time)

答案 2 :(得分:2)

首先创建一个包含保存计算的datediff的列的视图,然后从中构造一个查询可能会更好。