sql join - 仅从第二个表中选择第一行

时间:2009-11-30 10:29:36

标签: sql join distinct distinct-values

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

但是这会带来TableB的所有结果。如果有意义的话,我真的只想得到最近的电话?

4 个答案:

答案 0 :(得分:5)

您可以自己加入调用表,并指定不存在以后的行。像:

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,则会选择所有行。

这允许您选择最近一次通话中的所有列。

答案 1 :(得分:4)

如果您只想要表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

答案 2 :(得分:0)

这样的东西?

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;

答案 3 :(得分:0)

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并且事件不是太靠近,这应该是可靠的。

我知道的另一种方法是在MSSQL 2005 +中使用CROSS APPLY