【问题标题】:select last order date for each customer id为每个客户 ID 选择最后下单日期
【发布时间】:2013-04-12 11:37:40
【问题描述】:

我有一个 customerids、orderids 和订单日期列表,我想在另一个查询中使用这些列表来确定客户是否在此日期之后再次订购。

示例数据:

CustomerID  OrderID OrderDate
6619    16034   2012-11-15 10:23:02.603
6858    18482   2013-03-25 11:07:14.680
4784    17897   2013-02-20 14:45:43.640
5522    16188   2012-11-22 14:53:49.840
6803    18016   2013-02-28 10:41:16.713

查询:

SELECT    dbo.[Order].CustomerID, dbo.[Order].OrderID, dbo.[Order].OrderDate
FROM         dbo.[Order] INNER JOIN
                  dbo.OrderLine ON dbo.[Order].OrderID = dbo.OrderLine.OrderID 
WHERE     (dbo.OrderLine.ProductID in (42, 44, 45, 46,47,48))

如果你还需要什么,尽管问。

更新::

这个查询带回如上所示的结果

需要知道客户是否从那以后再次订购,对于订购上述查询中的产品之一后的任何产品 ID..

迈克

【问题讨论】:

  • 你想要的输出是什么?
  • 我想他想要某个客户的最后一个日期订单
  • 我已经更新了我的问题...

标签: sql sql-server-2008 tsql


【解决方案1】:

如果您只对每个客户的最后订购日期感兴趣

select customerid, max(orderdate) from theTable group by customerid;

【讨论】:

    【解决方案2】:

    在 MS SQL 中,您可以为此使用 TOP 1,您还需要按订单日期列按降序排序。

    看这里SQL Server - How to select the most recent record per user?

    【讨论】:

      【解决方案3】:
      SELECT    dbo.[Order].CustomerID, MAX(dbo.[Order].OrderDate)
      FROM         dbo.[Order] INNER JOIN
                        dbo.OrderLine ON dbo.[Order].OrderID = dbo.OrderLine.OrderID 
      WHERE     (dbo.OrderLine.ProductID in (42, 44, 45, 46,47,48))
      GROUP BY dbo.[Order].CustomerID
      

      获取客户的最新订购日期。

      【讨论】:

        【解决方案4】:

        CTE 中的ROW_NUMBER 应该可以工作:

        WITH cte 
             AS (SELECT customerid, 
                        orderid, 
                        orderdate, 
                        rn = Row_number() 
                               OVER( 
                                 partition BY customerid 
                                 ORDER BY orderdate DESC) 
                 FROM   dbo.tblorder 
                 WHERE  orderdate >= @orderDate 
                        AND customerid = @customerID) 
        SELECT customerid, orderid, orderdate
        FROM   cte 
        WHERE  rn = 1 
        

        DEMO

        (我省略了连接,因为不需要其他表中的列,只需添加它)

        【讨论】:

          【解决方案5】:

          在订购任何一组产品后订购任何产品的客户的 CustomerID 和最新的 OrderDate
          我怀疑它们是促销产品

          SELECT [Order].[CustomerID], max([Order].[OrderDate])
          FROM [Order]
          JOIN [Order] as [OrderBase]
            ON [OrderBase].[CustomerID] = [Order].[CustomerID] 
           AND [OrderBase].[OrderDate]  < [Order].[OrderDate]
          JOIN [OrderLine] 
            ON [OrderLine].[OrderID] = [OrderBase].[OrderID]
           AND [OrderLine].[ProductID] in (42,44,45,46,47,48)
          GROUP BY [Order].[CustomerID]
          

          【讨论】:

            猜你喜欢
            • 2010-12-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-02
            • 1970-01-01
            相关资源
            最近更新 更多