2014-11-05 1 views
2

i hava (очень большая) таблица на каждой строке, общее время поездки и текущая дата сохраняются. поэтому мне нужно соответствующее решение для большого количества записей. например, в 2014-10-03 09:00:00 я проехал 1 километр, затем вставляю текущую дату и 2101.00 км в поле totalTrip (totalTrip начинается с 2100 и может начинаться с любого числа). в следующий час я сделал еще 5 км пешком и сохранил totalTrip как 2105.00km. на следующий день я проехал еще 10 километров и вставил дату 2014-10-04 05:00:00 и общую поездку как 2115.00km в базу данных. В результате мне нужно группировать строки по дням и получать только км за каждый конкретный день. как я могу сделать это самым коротким и эффективным способом и возможно ли это с помощью «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

+1

@Strawberry следует читать 10.02, но это (2112.35 - 2102.33), потому что это расстояние, пройденное в тот день, с которого они остановились днем ​​раньше. – AdamMc331

ответ

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

+0

Да, понял. Спасибо за детали. Будет очень здорово, если вы включите комментарий в свой ответ. – Rahul

+0

@Strawberry благодарю вас, что здорово, что вы лучшие;). кстати, что вы понимаете, используя переменные? (я думаю, что это может быть до миллиона записей, возможно, больше я просто пытаюсь быть готовым, если произойдет маловероятная ситуация :)) – Skeletor

1

назовём стол 'table_name':

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

+0

Первая строка имеет значение null! попробуй. – Milad

+0

Мне просто интересно, почему это там, похоже, что это не повлияло бы, не так ли? – AdamMc331

Смежные вопросы