获得每个客户的第一个订单日期

时间:2018-03-07 22:19:31

标签: mysql

这个让我喝酒所以我会喜欢一些帮助。

我有一张桌子:

act_Address, act_OrderID, act_Date

我正在尝试为我们发送的每个地址获取第一个act_Date。

这是我尝试过的,但现在已经运行了一个多小时,所以我认为这不会起作用......

SELECT c.act_Address,

(SELECT o.act_OrderID 
FROM tbl_Activity o 
WHERE c.act_Address = o.act_Address 
ORDER BY o.act_Date 
LIMIT 1) AS order_id, 

(SELECT d.act_Date
FROM tbl_Activity d 
WHERE c.act_Address = d.act_Address 
ORDER BY d.act_Date 
LIMIT 1) as order_date

FROM tbl_Activity c

我必须做一些非常错误的事情,看起来好像第一次约会地址会那么难,但我不是那么聪明。

2 个答案:

答案 0 :(得分:1)

您的查询使用两个相关子查询来获取act_Dateact_OrderID值。每个子查询对tbl_Activity的每个记录执行一次。

您可以使用:

SELECT act_Address, MIN(act_Date) AS fist_Date
FROM tbl_Activity
GROUP BY act_Address

获取每个地址的第一个日期。然后,您可以将上述查询用作派生表并连接回原始表以获取其余字段:

SELECT t1.act_Address, t1.act_OrderID, t1.act_date
FROM tbl_Activity AS t1
JOIN (
   SELECT act_Address, MIN(act_Date) AS fist_Date
   FROM tbl_Activity
   GROUP BY act_Address
) AS t2 ON t1.act_Address = t2.act_Address AND t1.act_Date = t2.first_Date

我还建议在(act_Address, act_Date)上放置综合索引。

答案 1 :(得分:0)

您可以通过GROUP BY在子选择中执行此操作:

SELECT a.act_Address, a.act_OrderID, a.act_Date
FROM (
    SELECT a2.act_Address addr, MIN(a2.act_Date) mindate FROM tbl_Activity a2
    GROUP BY a2.act_Address
) g, tbl_Activity a
WHERE a.act_Address = g.addr AND a.act_Date = g.mindate;