2014-07-21 60 views
1

我有一個表作爲
累積式差分數據在MySQL表

+-----------+--------+------------+-------------+ 
| taxino | driver | allotdate | returndate | 
+-----------+--------+------------+-------------+ 
| 31032  | John | 2014-06-13 | 2014-06-15 | 
| 31032  | John | 2014-06-18 | NULL  | 
| 40001  | John | 2014-01-01 | 2014-06-01 | 
| 40001  | Alice | 2014-06-15 | NULL  | 
| 40002  | Alice | 2014-05-17 | 2014-06-18 | 
| 40003  | Robin | 2014-06-17 | 2014-06-18 | 
+-----------+--------+------------+-------------+ 

此表顯示,當一輛的士分配給司機,NULL在returndate柱表示沒有返回的出租車。
我有一個距離,報告表作爲

+------------+---------+------------+-----+ 
| taxi | reportdate | distance_in_km | 
+------------+---------+------------+-----+ 
| 40001 | 2014-04-30 |    527 | 
| 40001 | 2014-05-26 |    1497 | 
| 40002 | 2014-04-30 |    1414 | 
| 40002 | 2014-05-26 |    2796 | 
| 40003 | 2014-04-22 |    392 | 
| 40003 | 2014-05-26 |    1663 | 
+------------+---------+------------+-----+ 

這裏的距離是累積性的,也就是說,行駛距離以前reportdate將在下一報告補充道。使用這些表格,我想知道哪個司機駕駛出租車多久,無論他駕駛的是哪輛出租車。如下圖所示:

Driver | date | distance_traveled_by_driver

這裏distance_traveled_by_driver不是累積的,即它包含兩個報告日期之間的距離。請幫我做這件事。

回答

1

此查詢顯示

select driver, reportdate, distance_since_last from (
    select t1.driver, 
    t2.reportdate, 
    if(@prevTaxi = t2.taxi, 
     t2.distance_in_km - @prevDistance, 
     t2.distance_in_km) distance_since_last, 
    @prevTaxi := t2.taxi, 
    @prevDistance := t2.distance_in_km 
    from table1 t1 
    join table2 t2 on t1.taxino = t2.taxi 
    cross join (select @prevDistance := 0, @prevTaxi := 0) t3 
    order by taxi, reportdate 
) t1 
+0

非常感謝距離上次報告日期驅動:getRealName( 「FuzzyTree」); –

+0

但是當我這樣做時,我得到5列而不是3。這很重要,因爲我將從該查詢生成的數據中創建一個臨時表。所以請做一些刪除這些額外的列。 –

+0

@ShailPandey您可以將查詢包裝到派生表中,並只選擇所需的列,請參閱更新 – FuzzyTree