2017-08-18 79 views
0

我是一個SQL初學者,正在學習查詢的繩索。我試圖找到同一客戶購買日期之間的差異。我有一個數據集,看起來像這樣:計算MySQL中每個唯一ID的前一行的日期差異

ID | Purchase_Date 
================== 
1 | 08/10/2017 
------------------ 
1 | 08/11/2017 
------------------ 
1 | 08/17/2017 
------------------ 
2 | 08/09/2017 
------------------ 
3 | 08/08/2017 
------------------ 
3 | 08/10/2017 

我想有一欄,顯示爲每個獨特的客戶購買天的差異,從而使輸出看起來就像這樣:

ID | Purchase_Date | Difference 
=============================== 
1 | 08/10/2017 | NULL 
------------------------------- 
1 | 08/11/2017 | 1 
------------------------------- 
1 | 08/17/2017 | 6 
------------------------------- 
2 | 08/09/2017 | NULL 
------------------------------- 
3 | 08/08/2017 | NULL 
------------------------------- 
3 | 08/10/2017 | 2 

使用MySQL查詢來解決這個問題的最好方法是什麼?

+0

看到解決[我爲什麼要提供什麼似乎我的MCVE是一個非常簡單的SQL查詢]( http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query) – Strawberry

回答

2

這在MySQL中相當棘手。也許是最好的學習方式,如果你是一個剛開始是相關子查詢方法:

select t.*, datediff(purchase_date, prev_purchase_date) as diff 
from (select t.*, 
      (select t2.purchase_date 
       from t t2 
       where t2.id = t.id and 
        t2.purchase_date < t.purchase_date 
       order by t2.purchase_date desc 
       limit 1 
      ) as prev_purchase_date 
     from t 
    ) t; 

性能應該沒問題,如果你在(id, purchase_date)有一個索引。

+0

這看起來像一個合理,直接的方式來做到這一點。我幾乎想要向OP建議,將來可能會在插入新購買行時計算日期差異。 – Cubis

+0

您的查詢和來自@ charles-bretana的查詢是查詢不同的他正在使用連接,而您沒有。使用其中之一的缺點/好處是什麼? – Noob

+0

您應該嘗試使用這兩種方法來查看哪個方法具有更好的性能。這看起來更簡單,沒有任何聚合,只有一個子查詢。 –

2

不那麼難,只需使用子查詢爲客戶的每個現有購買查找以前的購買,並自動加入該記錄。

Select t.id, t.PurchaseDate, p.Purchase_date, 
    DATEDIFF(t.PurchaseDate, p.Purchase_date) Difference 
From myTable t   -- t for This purchase record 
    left join myTable p -- p for Previous purchase record 
     on p.id = t.Id 
     and p.purchase_date = 
      (Select Max(purchase_date) 
      from mytable 
      where id = t.id 
       and purchase_date < 
        t.purchaseDate) 
1

有可能它不使用相關子查詢

SELECT yt.id, create_date, NULLIF(yt.create_date - tm.min_create_date, 0) 
FROM your_table yt 
JOIN 
(
    SELECT id, MIN(create_date) min_create_date 
    FROM your_table 
    GROUP BY id 
) tm ON tm.id = yt.id 

sqlfiddle demo