我有两个表在几乎完全相同的时间更新 - 我需要加入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
)
但它告诉我:
在包含外部引用的聚合表达式中指定了多个列。如果聚合的表达式包含外部引用,则该外部引用必须是表达式中引用的唯一列。
我如何加入这些表?
答案 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)
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的列的视图,然后从中构造一个查询可能会更好。