2014-11-05 24 views
2

我在每一行上都有一個非常大的表格,總存儲行程和當前日期。所以我需要一個適合大量記錄的解決方案。例如在2014-10-03 09:00:00我走了1公里,然後我插入當前日期和2101.00公里到totalTrip字段(totalTrip從2100開始,並可能從任何數字開始)。接下來的一小時,我又走了5公里的路程,把總行程存儲爲2105.00公里。第二天,我走了10多公里,並插入日期2014-10-04 05:00:00和總行程爲2115.00公里的數據庫。 作爲結果,我需要按天分組行,只有在每個特定的一天獲得km。我怎樣才能以最短和有效的方式做到這一點,並可以通過使用「group by」?我希望我能解釋我的情況。如何分組mysql表格計算每個表格的總行程距離

這裏(樣本)我有什麼:

id  date     totalTrip 
1  2014-10-03 09:00:00  2100.23 
2  2014-10-03 10:00:00  2102.33 
3  2014-10-04 05:00:00  2112.35 
4  2014-10-05 02:00:00  2120.37 
5  2014-10-05 03:00:00  2140.41 
6  2014-10-05 05:00:00  2155.45 

這裏(樣本)我想要什麼:

date   traveledDistance 
2014-10-03 2.10 
2014-10-04 10.03 
2014-10-05 43.10 
+0

10.03 ?????????? – Strawberry 2014-11-05 17:52:06

+1

@Strawberry它應該讀取10.02,但它是(2112.35 - 2102.33),因爲它是從他們從前一天離開的那一天走過的距離。 – AdamMc331 2014-11-05 17:53:34

回答

3
DROP TABLE IF EXISTS my_table; 

    CREATE TABLE my_table 
    (id  INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
    ,date     DATETIME NOT NULL 
    ,totalTrip DECIMAL(7,2) NOT NULL 
); 

    INSERT INTO my_table VALUES 
    (1  ,'2014-10-03 09:00:00',  2100.23), 
    (2  ,'2014-10-03 10:00:00',  2102.33), 
    (3  ,'2014-10-04 05:00:00',  2112.35), 
    (4  ,'2014-10-05 02:00:00',  2120.37), 
    (5  ,'2014-10-05 03:00:00',  2140.41), 
    (6  ,'2014-10-05 05:00:00',  2155.45); 

    SELECT DATE(a.date) date 
     , SUM(a.diff) total 
    FROM 
     (SELECT y.* 
       , MIN(y.totaltrip)-x.totaltrip diff 
      FROM my_table x 
      JOIN my_table y 
      ON y.id > x.id 
      GROUP 
      BY x.id 
     ) a 
    GROUP 
     BY DATE(a.date); 
    +--------------+-------+ 
    | date   | total | 
    +--------------+-------+ 
    | 2014-10-03 | 2.10 | 
    | 2014-10-04 | 10.02 | 
    | 2014-10-05 | 43.10 | 
    +--------------+-------+ 

說明:每行中運行的距離從最接近的後續行MIN(y.totaltrip)-x.totaltrip中扣除。之後,所有這些中間結果按日期加總。就這樣。請注意,如果「非常大」的意思是「非常非常大」(非常不可能),那麼使用變量的解決方案將顯着加快。

+0

+1不錯的一個。心靈也給予一點解釋。只是想明白。 – Rahul 2014-11-05 18:00:34

+0

是的,明白了。感謝細節。如果您在評論中包含評論,這將非常棒。 – Rahul 2014-11-05 18:08:05

+0

@Strawberry謝謝你,這很好,你是最好的;)。順便說一下,你使用變量是什麼意思? (我認爲它可能高達一百萬條記錄也許更多我只是試圖做好準備,如果不太可能的情況發生:)) – Skeletor 2014-11-05 18:23:59

1

我們稱之爲表 '表名':

SELECT 
    foo.date, SUM(foo.totalTrip - table_name.totalTrip) AS totalTrip 
FROM 
    table_name 
     INNER JOIN 
    (SELECT id - 1 AS id, date, totalTrip FROM table_name) AS foo 
     ON foo.id = table_name.id 
GROUP BY date 
+0

爲什麼需要限制條款? – AdamMc331 2014-11-05 18:03:36

+0

第一行爲空!嘗試一下。 – Milad 2014-11-05 18:04:20

+0

我只是想知道爲什麼它在那裏,它似乎不會有影響,是嗎? – AdamMc331 2014-11-05 18:05:46