【问题标题】:SQL Server 2012 Query ConfusionSQL Server 2012 查询混乱
【发布时间】:2015-01-31 03:32:46
【问题描述】:

我是 SQL 初学者,我似乎无法针对这个问题提出正确的查询:

使用相关子查询为每位客户返回一行,代表客户最早的订单(日期最早的订单)。每行应包括以下三列:EmailAddress、OrderID 和 OrderDate。

我首先加入订单和客户表。 EmailAddress 是客户表中唯一需要的列。

      SELECT EmailAddress, OrderDate, orderID
      FROM Customers c JOIN orders o
      ON c.CustomerID = o.CustomerID

【问题讨论】:

    标签: sql-server-2012


    【解决方案1】:

    一个不太复杂的答案:

    SELECT  EmailAddress, OrderID, OrderDate AS OldestOrder
      FROM  Customers AS C
            JOIN Orders AS O1
                ON C.CustomerID = O1.CustomerID
     WHERE  O1.OrderDate =
                (SELECT MIN(OrderDate)
                 FROM Orders AS O2
                 WHERE C.CustomerID = O2.CustomerID)
    

    【讨论】:

      【解决方案2】:

      使用ROW_NUMBER() 获取按OrderDate 降序订购的每个客户的唯一ID。最新日期为RNO=1。现在在外部查询中进行过滤。

      SELECT EmailAddress, OrderDate, orderID
      FROM
      (
         SELECT ROW_NUMBER() OVER(PARTITION BY c.CustomerID ORDER BY OrderDate DESC)RNO,
         EmailAddress, OrderDate, orderID
         FROM Customers c JOIN orders o
         ON c.CustomerID = o.CustomerID
      )TAB 
      WHERE RNO=1
      

      【讨论】:

        【解决方案3】:

        您仍然可以使用 HAVING 子句和 IN 运算符来针对这个特定问题获得相同的结果

        代码:

        SELECT DISTINCT EmailAddress, OrderID, OrderDate
        FROM Customers
            JOIN orders
            ON Customers.CustomerID = Orders.CustomerID
        GROUP BY EmailAddress, OrderID, OrderDate
        HAVING OrderID IN (1,2,4,5,6,7,8)
        ORDER BY EmailAddress ASC;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多