0

我正在尝试创建一个带有客户 ID 和第一次、第二次和第三次购买日期的仪表板。我使用 MySQL,Northwind 数据库。

我的查询对于第一次购买非常有效,但我不明白如何为每个客户找到第二次和第三次购买日期。

现在我正在尝试下一步: 2nd_purchase_date 是 1st_purchase_date 之后的下一个 MIN(OrderDate) 但我收到以下错误“无效使用组函数”

DROP TABLE IF EXISTS t1;
CREATE TABLE t1
(
    CustomerID varchar(5),
    OrderDate datetime,
    OrderID int,
    i int
);

INSERT INTO t1(CustomerID, OrderDate, OrderID, i)
SELECT CustomerID, min(OrderDate), min(OrderID),1
FROM Orders
GROUP BY CustomerID;

INSERT INTO t1(CustomerID, OrderDate, OrderID, i)
SELECT CustomerID,min(OrderDate), min(OrderID),2
FROM Orders
WHERE min(OrderDate) 
NOT IN 
(
SELECT CustomerID, min(OrderDate), min(OrderID)
FROM Orders
)
GROUP BY CustomerID;

INSERT INTO t1(CustomerID, OrderDate, OrderID, i)
SELECT CustomerID,min(OrderDate), OrderID,3
FROM Orders
WHERE min(OrderDate) 
NOT IN 
(
SELECT CustomerID, min(OrderDate), min(OrderID) FROM Orders
)
GROUP BY CustomerID;
4

1 回答 1

0

如这里最后一个示例所示您可以LIMIT offset, count结合使用该功能ORDER BY column ASC为单个用户选择具有第二个购买日期的条目(将 id XXX替换为相应的值):

SELECT CustomerID, OrderDate, OrderID
  FROM Orders
  WHERE CustomerID = XXX
  ORDER BY OrderDate ASC
  LIMIT 1, 1;

或带有第三个购买日期的条目:

SELECT CustomerID, OrderDate, OrderID
  FROM Orders
  WHERE CustomerID = XXX
  ORDER BY OrderDate ASC
  LIMIT 2, 1;

... 等等。


您通过以下方式获得第一个条目

SELECT CustomerID, OrderDate, OrderID
  FROM Orders
  WHERE CustomerID = XXX
  ORDER BY OrderDate ASC
  LIMIT 0, 1;

或等价物:

SELECT CustomerID, OrderDate, OrderID
  FROM Orders
  WHERE CustomerID = XXX
  ORDER BY OrderDate ASC
  LIMIT 1;

这应该为您提供单个客户的前三个订单:

SELECT CustomerID, OrderDate, OrderID
  FROM Orders
  WHERE CustomerID = XXX
  ORDER BY OrderDate ASC
  LIMIT 3;

尽管从性能的角度来看,以下内容肯定不好,但它仍然可以为您提供每个客户的前三个订单:

SELECT o1.CustomerID, o1.OrderDate, o1.OrderID
  FROM Orders o1
  WHERE o1.OrderID IN
        (SELECT o2.OrderID
           FROM Orders o2
           WHERE o1.CustomerID = o2.CustomerID
           ORDER BY o2.OrderDate ASC LIMIT 3)
  ORDER BY o1.CustomerID, o2.OrderDate ASC;
于 2015-07-28T03:30:20.960 回答