Как насчет чего-то вроде (при условии 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
, упорядоченное по абсолютному значению значения A.DateTime
"близости" к значению B.DateTime
. Таким образом, я оцениваю «близость», используя Abs(DateDiff(s,A.DateTime, B.DateTime)
и выбирая наивысший ранг (rank = 1, или «ближайшее» значение) для каждого значения A.DateTime
. Не имеет значения, есть ли связь, поскольку функция ROW_NUMBER()
будет возвращать уникальный список чисел для каждого значения A.DateTime
.