1

有点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

4 回答 4

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,这将选择所有行。

这允许您从最新调用中选择所有列。

于 2009-11-30T10:50:14.053 回答
4

如果您只想要表 b 中的开始时间,您可以使用 group by

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
于 2009-11-30T10:33:06.617 回答
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

于 2012-04-03T19:41:13.050 回答
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;
于 2009-11-30T10:36:04.427 回答