sql join - только выбрать верхнюю строку из 2-й таблицы - PullRequest
1 голос
/ 30 ноября 2009

Бит sql noob, есть список в таблице a кодов клиентов / телефонных номеров, а таблица b содержит все записи вызовов.

Я хочу выбрать самый последний звонок из таблицы b для каждого из кодов клиентов / телефонных номеров в таблице a.

Пока у меня есть:

SELECT     A.CustomerCode, A.PhoneNumber, B.StartTime
FROM         tableA A INNER JOIN
             tableB B ON ( A.PhoneNumber = B.PhoneNumber 
                           AND A.CustomerCode = B.CustomerCode )
ORDER BY A.CustomerCode, A.CLI, B.StartTime DESC

Но это поднимает все результаты из Таблицы B. Я буквально хочу получить самый последний звонок, если это имеет смысл?

Ответы [ 4 ]

5 голосов
/ 30 ноября 2009

Вы можете присоединиться к таблице вызовов самостоятельно и указать, что более поздняя строка не может существовать. Как:

SELECT       A.CustomerCode, A.PhoneNumber, B.StartTime
FROM         tableA A 
INNER JOIN   tableB B 
ON           A.PhoneNumber = B.PhoneNumber 
AND          A.CustomerCode = B.CustomerCode
LEFT JOIN    tableB later
ON           B.PhoneNumber = later.PhoneNumber 
AND          B.CustomerCode = later.CustomerCode
AND          later.StartTime > B.StartTime
WHERE        later.PhoneNumber is null

Условие later.PhoneNumber is null говорит, что не может быть более поздней строки. Если есть несколько строк с одним и тем же StartTime, это выберет все из них.

Это позволяет выбрать все столбцы из последнего вызова.

4 голосов
/ 30 ноября 2009

Если вы хотите, чтобы время начала только из таблицы b, вы можете использовать группу по

SELECT     A.CustomerCode, A.PhoneNumber, max(B.StartTime)
FROM         tableA A INNER JOIN
             tableB B ON A.PhoneNumber = B.PhoneNumber 
                         AND A.CustomerCode = B.CustomerCode
GROUP BY A.CustomerCode, A.PhoneNumber
ORDER BY A.CustomerCode, A.CLI
0 голосов
/ 03 апреля 2012
SELECT A.CustomerCode, A.PhoneNumber, B.StartTime
FROM   tableA A INNER JOIN tableB B 
       ON A.PhoneNumber = B.PhoneNumber AND A.CustomerCode = B.CustomerCode
WHERE  B.StartTime = (SELECT MIN(StartTime) FROM B 
                      WHERE PhoneNumber = A.PhoneNumber 
                      AND CustomerCode = A.CustomerCode)
ORDER BY A.CustomerCode, A.CLI, B.StartTime DESC

Я полагаю, что это даст желаемый результат, при условии, что B.StartTime имеет значение уникальное в наборе, связанном с каждой строкой таблицы A. Если вы имеете дело с DateTime и событиями, не слишком близкими, это должно быть надежно.

Единственный известный мне способ - использовать CROSS APPLY в MSSQL 2005 +

0 голосов
/ 30 ноября 2009

Как то так?

SELECT A.CustomerCode, A.PhoneNumber, Max(B.StartTime) AS MaxOfStartTime
FROM A INNER JOIN B ON A.PhoneNumber = B.PhoneNumber
GROUP BY A.CustomerCode, A.PhoneNumber;
...