Как рассчитать расстояние, пройденное за день, исходя из пробега

avatar
tomwassing
7 апреля 2018 в 22:56
37
1
0

Я пытаюсь рассчитать пройденное расстояние на основе пробега. Я беру расстояния MAX и MIN в день и вычитаю их друг из друга. Однако при этом не используется «последний» километраж предыдущего дня, поэтому часть «расстояния» отсутствует.

Как я могу получить «последний» пробег до указанного дня и вместо этого использовать его в качестве МИН. пробега.

SQL Fiddle: http://www.sqlfiddle.com/#!7/3ea7d/7/0

PS: В этой скрипте я использую простой «день», хранящийся как целое число, однако в реальной реализации это дата, хранящаяся как эпоха, которая затем преобразуется в день с помощью strftime.

Желаемые результаты:

day      distance
1        300
2        400
3        400
Источник
Gordon Linoff
7 апреля 2018 в 22:56
0

Каких результатов вы хотите?

tomwassing
7 апреля 2018 в 22:58
0

@GordonLinoff Я включил в вопрос желаемые результаты.

Ответы (1)

avatar
Gordon Linoff
7 апреля 2018 в 22:59
1

Предполагая, что вам нужен максимум за предыдущий день, вы можете использовать коррелированный подзапрос:

WITH td as (
      SELECT t.day, MAX(t.distance) as maxd, MIN(t.distance) mind
      FROM trips t
      GROUP BY t.day
     )
SELECT td.day,
       (maxd -
        COALESCE( (SELECT MAX(td2.maxd)
                   FROM td td2
                   WHERE td2.day < td.day
                  ),
                  td.mind
                )
       ) as diff
FROM td;

Большинство баз данных поддерживают функцию LAG() стандарта ANSI, что значительно упрощает работу. Увы, SQLite его не поддерживает.

tomwassing
7 апреля 2018 в 23:22
0

Потрясающий! Можно ли заменить коррелированный подзапрос на JOIN?

Gordon Linoff
8 апреля 2018 в 02:05
0

@томвассинг . . . Вы можете заменить его на join и group by, но это, вероятно, будет иметь еще худшую производительность.