选择每个客户ID的最后订单日期

时间:2013-04-12 11:37:40

标签: sql sql-server-2008 tsql

我有一个customerid,orderid和订单日期的列表,我想在另一个查询中使用它来确定客户自此日期以来是否再次订购过。

示例数据:

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))

如果您还需要其他任何东西,请询问。

UPDATE ::

此查询会返回上面显示的结果

需要知道客户是否已再次订购,因为在订购上述查询中的某个产品后,对于任何产品ID ...

麦克

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

ROW_NUMBER中的

CTE应该有效:

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

客户ID和最新订单,适用于订购任何产品后订购任何产品的客户
我怀疑它们是促销产品

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]