【问题标题】:sql join - only select top row from 2nd tablesql join - 仅从第二个表中选择第一行
【发布时间】:2010-12-21 14:22:03
【问题描述】:

一个sql菜鸟,在表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 中的所有结果。如果有意义的话,我真的只是想接听最近的电话?

【问题讨论】:

    标签: sql join distinct distinct-values


    【解决方案1】:
    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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        您可以加入调用表本身,并指定后面的行可能不存在。喜欢:

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

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

        【讨论】:

          【解决方案4】:

          这样的?

          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;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-09-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多