2009-11-30 83 views
1

sql noob的位,客户代码/电话号码的表a中有一个列表,而表b具有所有的通话记录。sql join - 仅从第二个表中选择第一行

我想为表a中的每个客户代码/电话号码从表b中选择最近的呼叫。

到目前为止,我有:

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

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

像这样使用一组?

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

这使您可以选择最新呼叫的所有列。

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的每一行设定独特,这应该是可靠的。

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

相关问题