Как я могу вычесть две строки в одном столбце в одну и ту же дату? - PullRequest
0 голосов
/ 18 января 2019

У меня есть запрос. Я хочу сделать вычитание первого и последнего ряда в один и тот же день. Я написал этот запрос, но я не был уверен в производительности. Есть ли альтернативный способ решения этой проблемы?

| imei  |    date                 | km    |
|-----------------------------------------|
| 123   | 2019-01-15 00:00:01     | 15    |
| 123   | 2019-01-15 12:12:08     | 8     |
| 123   | 2019-01-15 23:00:59     | 30    |
| 456   | 2019-01-15 00:03:12     | 232   |
| 456   | 2019-01-15 07:04:00     | 123   |
| 456   | 2019-01-15 23:16:18     | 464   |

Мой запрос:

SELECT 
gg.imei,
DATE_FORMAT(gg.datee, '%Y-%m-%d'),
gg.km - (SELECT 
        g.km
    FROM
        gps g
    WHERE
        g.datee LIKE '2019-01-15%'
            AND g.datee = (SELECT 
                MIN(t.datee)
            FROM
                gps t
            WHERE
                t.datee LIKE '2019-01-15%'
                    AND t.imei = g.imei)
            AND g.imei = gg.imei
    GROUP BY g.imei) AS km
FROM
    gps gg
WHERE
gg.datee LIKE '2019-01-15%'
    AND gg.datee = (SELECT 
        MAX(ts.datee)
    FROM
        gps ts
    WHERE
        ts.datee LIKE '2019-01-15%'
            AND gg.imei = ts.imei)

Результат верен.

| imei    |    date    | km    |
|------------------------------|
| 123     | 2019-01-15 | 15    |
| 456     | 2019-01-15 | 232   |

Но запрос слишком сложный.

Редактировать: в таблице 3 миллиона записей.

1 Ответ

0 голосов
/ 18 января 2019

Вы можете найти первую и последнюю дату-время для каждой пары imei-date в подзапросе, а затем присоединиться к ней:

SELECT agg.imei, agg.date_date, gps_last.km - gps_frst.km AS diff
FROM (
    SELECT imei, DATE(date) AS date_date, MIN(date) AS date_frst, MAX(date) AS date_last
    FROM gps
    GROUP BY imei, DATE(date)
) AS agg
JOIN gps AS gps_frst ON agg.imei = gps_frst.imei AND agg.date_frst = gps_frst.date
JOIN gps AS gps_last ON agg.imei = gps_last.imei AND agg.date_last = gps_last.date

Вам нужны соответствующие индексы на вашей таблице. В частности, часть DATE(date) будет медленной, поэтому вы можете рассмотреть возможность добавления еще одного столбца для хранения только части даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...