SQL - Как объединить на похожих (не точных) столбцах - PullRequest
1 голос
/ 12 мая 2010

У меня есть две таблицы, которые обновляются в почти в одно и то же время - мне нужно присоединиться к столбцу 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 ]

4 голосов
/ 12 мая 2010

Как насчет чего-то вроде (при условии 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.

3 голосов
/ 12 мая 2010

Это то, что вы хотите? Он проверит разницу в 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 голосов
/ 12 мая 2010

Может быть лучше сначала создать представление, содержащее столбец, содержащий ваш вычисленный дата, а затем создать запрос из этого.

...