2012-05-18 75 views
0

我有一個表,像這樣的命令:mysql的計算天

+----------+-------------+------------+ 
| order_id | customer_id | order_date | 
+----------+-------------+------------+ 
| 404 |  16  | 2006-11-04 | 
| 726 |  16  | 2007-11-01 | 
| 440 |  16  | 2010-03-15 | 
| 515 |  16  | 2011-04-29 | 
| 539 |  16  | 2011-11-01 | 
| 293 |  89  | 2001-08-28 | 
| 156 |  89  | 2002-05-03 | 
| 238 |  89  | 2003-09-15 | 
| 299 |  28  | 2001-10-26 | 
| 314 |  28  | 2004-03-18 | 
| 142 |  79  | 2002-01-21 | 
| 313 |  12  | 2004-03-11 | 
| 388 |  12  | 2005-11-22 | 
| 507 |  12  | 2007-03-27 | 
| 286 |  14  | 2006-04-17 | 
| 200 |  14  | 2008-05-25 | 
| 130 |  14  | 2009-06-24 | 
| 527 |  19  | 2011-05-14 | 
| 298 |  76  | 2001-10-20 | 
| 165 |  76  | 2002-07-27 | 
| 212 |  11  | 2003-02-17 | 
| 412 |  11  | 2006-08-02 | 
| 423 |  11  | 2007-03-28 | 
| 388 |  10  | 2005-01-07 | 
| 390 |  65  | 2006-06-07 | 
| 44 |  65  | 2008-01-07 | 
| 269 |  16  | 2008-02-25 | 
| 413 |  14  | 2007-12-01 | 
| 675 |  14  | 2007-09-11 | 
| 260 |  14  | 2009-10-20 | 
+----------+-------------+------------+ 

現在我需要一個查詢至極給我這樣一個列表:

+-------------+------------+------------+------+ 
| customer_id | date1 | date2 | days | 
+-------------+------------+------------+------+ 
|  16  | 2006-11-04 | 2007-11-01 | 362 | 
|  16  | 2007-11-01 | 2010-03-15 | 865 | 
|  16  | 2010-03-15 | 2011-04-29 | 410 | 
|  16  | 2011-04-29 | 2011-11-01 | 186 | 
|  89  | 2001-08-28 | 2002-05-03 | 248 | 
|  89  | 2002-05-03 | 2003-09-15 | 500 | 
+-------------+------------+------------+------+ 

列日在天時間跨度從一個訂單到每個客戶的下一個訂單。

+0

尼斯鏈接約翰... – Rahul

回答

0

你可以嘗試這樣的事情:

SELECT A.customer_id, 
    A.date as date1, 
    B.date as date2, 
    datediff(B.date, A.date) as days 
FROM (select @curRowA := @curRowA + 1 AS row_number, 
     customer_id, 
     date from 
     orders 
    ORDER BY customer_id asc, date desc) A 
INNER JOIN (select @curRowB := @curRowB + 1 AS row_number, 
      customer_id, 
      date from orders 
    ORDER BY customer_id asc, date desc offset 1) B 
ON A.row_number = B.row_number AND A.customer_id = B.customer_id 

正如你所看到的,我有一個選擇,從訂單表中的所有記錄,但增加了ROW_NUMBER分爲A子查詢,然後我做同樣的事情,但只是轉移一行向下(偏移量1)並創建B.然後,我只需加入A和B,即可獲得結果。

A 
    row_id, customer, date 
    1, 1, d1 
    2, 1, d2 
    3, 1, d3 
    4, 2, d4 
    5, 2, d5 

B 
    row_id, customer, date 
    1, 1, d2 
    2, 1, d3 
    3, 2, d4 
    4, 2, d5 

當A和B加入

result 
customer, date1, date2 
1, d1, d2 
1, d2, d3 
2, d4, d5 

UPDATE:按照馬克的評論,它可能是更好地嘗試從相關查詢獲取日期2(客戶),您選擇的日期,其體積更小比日期和限制導致1行。

+0

可以只使用相關子查詢來獲取每個用戶更大的行比父行中的日期更長,限制爲1.這會大大簡化事情。 –

+0

你是對的..它可能會表現更好。這首先出現在我的腦海裏,所以我以這種方式寫下了它。 –

0

你可以請試試這個,很好的測試...

SELECT distinct(c1.customer_id) as 'customer_id', 

(select min(c2.order_date) from tmp2 c2 where c2.customer_id=c1.customer_id) as date1, (select max(c2.order_date) from tmp2 c2 where c2.customer_id=c1.customer_id) as date2, (DATEDIFF((select max(c40.order_date) from tmp2 c40 where c40.customer_id=c1.customer_id) , (select min(c40.order_date) from tmp2 c40 where c40.customer_id=c1.customer_id))) as 'days' FROM TMP2 as c1 WHERE 1