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的所有结果。如果有意义的话,我真的只想得到最近的电话?
答案 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