1

少しSQL初心者で、テーブルaに顧客コード/電話番号のリストがあり、テーブルbにはすべての通話記録があります。

テーブル 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

しかし、それは 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とイベントが近すぎない場合、これは信頼できるはずです。

私が知っている他の唯一の方法は、MSSQL2005+でCROSSAPPLYを使用することです。

于 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 に答える