Добавление значений даты и времени окончания в столбцы даты окончания и времени начала строки - PullRequest
0 голосов
/ 22 марта 2020

Я работаю с данными GPS, извлеченными из множества loggerid, и в моей таблице есть последовательные строки с дубликатами lat и lon, что противоречит настройкам. Я хочу сохранить только первую строку каждого последовательного дубликата широты и долготы, хранить datecon и timecon последней строки каждого последовательного дубликата широты и долготы в столбцах enddate и endtime вышеупомянутой первой строки соответственно, и удалите все строки этих последовательных дубликатов широты и долготы, включая последний ряд.

Вот так выглядит моя таблица:

id, loggerid, datecon, timecon, lat, lon
200, 1, 2018-07-18, 07:04:10, 16.694834, 100.319834
201, 1, 2018-07-18, 07:36:30, 16.694834, 100.319834
202, 1, 2018-07-18, 08:11:00, 16.694834, 100.319834
203, 1, 2018-07-18, 08:49:25, 16.851309, 100.315957
204, 1, 2018-07-18, 09:20:58, 16.851309, 100.315957
300, 2, 2018-08-20, 13:52:22, 16.947631, 100.321598
301, 2, 2018-08-20, 14:27:34, 16.947631, 100.321598
302, 2, 2018-08-20, 14:59:11, 16.392313, 100.395439

Вывод, который я пытаюсь достичь:

id, loggerid, datecon, timecon, enddate, endtime, lat, lon
200, 1, 2018-07-18, 07:04:10, 2018-07-18, 08:11:00, 16.694834, 100.319834
203, 1, 2018-07-18, 08:49:25, 2018-07-18, 09:20:58, 16.851309, 100.315957
300, 2, 2018-08-20, 13:52:22, 2018-08-20, 14:27:34, 16.947631, 100.321598
302, 2, 2018-08-20, 14:59:11, [null], [null], 16.392313, 100.395439 

Кто-нибудь знает какое-нибудь решение?

1 Ответ

0 голосов
/ 22 марта 2020

Это проблема пробелов и островков, когда вы хотите сгруппировать последовательные строки для одного и того же регистратора, имеющих одинаковую широту и долготу.

Вот один из подходов, использующий разницу между row_number() с для идентификации группы:

select
    min(id) id,
    loggerid,
    min(datecon + timecon) first_datetimecon,
    max(datecon + timecon) last_datetimecon,
    lat,
    lon
from ( 
    select
        t.*,
        row_number() over(partition by loggerid order by datecon + timecon) rn1,
        row_number() over(partition by loggerid, lat, lon order by datecon + timecon) rn2
    from mytable t
) t
group by loggerid, lat, lon

Обратите внимание, что не рекомендуется хранить части даты и времени в отдельных столбцах, поскольку это усложняет ситуацию, когда вам действительно нужно сравнивать значения даты и времени. Приведенный выше запрос дает начальный и конечный значения datetime s для каждой серии.

...