Как суммировать строки в Oracle? - PullRequest
1 голос
/ 05 августа 2020

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

Итак, проблема:

Каждые 2 минуты я получаю новую строку на моем таблица с различной информацией. Это:

ID_VEIC - Vehicle ID
DT_POSI - Position date
LAT - latitude
LONGI - longitude
SPEED - car speed when positioning
GMT - Vehicle gmt.

Некоторые из этих положений идут со скоростью, равной нулю, что в моем случае означает, что автомобиль остановлен. Если есть несколько положений остановленного транспортного средства (скорость = 0), я должен выбрать только последнее положение остановки между двумя положениями движения.

Объяснение с изображениями:

Таблица img

На изображении выбраны две строки, где скорость равна 0. Мне нужно каким-то образом показать только последнюю строку этого периода, в случае строки 11, и при этом все остальные строки, где скорость равна > 0.

Более подробно здесь:

Текущий набор результатов:

ROWNUM  ID_VEIC    DAT_POSI              LAT            LONGI   SPEED        
1   1211678   06/08/2020 06:08  -254.454.135       -544.047.225   15    
2   1211678   06/08/2020 06:38  -25.445.364        -544.047.383   20    
3   1211678   06/08/2020 07:08  -25.445.401        -54.404.762     0    
4   1211678   06/08/2020 07:38  -254.454.135       -544.046.878    0    
5   1211678   06/08/2020 08:08  -254.454.255       -544.046.828   10    
6   1211678   06/08/2020 08:38  -254.453.996       -54.404.707    25    
7   1211678   06/08/2020 09:08  -25.445.428        -544.047.445   45    
8   1211678   06/08/2020 09:38  -254.454.583       -544.048.415    0    

Желаемый набор результатов

 ROWNUM ID_VEIC    DAT_POSI              LAT            LONGI   SPEED        
    1   1211678   06/08/2020 06:08  -254.454.135       -544.047.225   15    
    2   1211678   06/08/2020 06:38  -25.445.364        -544.047.383   20    
    3   1211678   06/08/2020 07:38  -254.454.135       -544.046.878    0    
    4   1211678   06/08/2020 08:08  -254.454.255       -544.046.828   10    
    5   1211678   06/08/2020 08:38  -254.453.996       -54.404.707    25    
    6   1211678   06/08/2020 09:08  -25.445.428        -544.047.445   45    
    7   1211678   06/08/2020 09:38  -254.454.583       -544.048.415    0    

Строка 3 была удалена, и только отображается строка, которая ранее была строкой 4.

Есть идеи, как это сделать?

Ниже используемого выбора:

SELECT  ID_VEIC,
        DAT_POSI,
        LAT,
        LONGI, 
        SPEED,
        GMT
  FROM LITERAL_VIEW   
 WHERE  ID_VEIC= 1211678
   AND DAT_POSI BETWEEN SYSDATE - INTERVAL '2' HOUR AND SYSDATE
   AND ROWNUM <= 999
 ORDER BY ID_VEIC, 
          DAT_POSI; 

1 Ответ

2 голосов
/ 05 августа 2020

Вы можете использовать оконные функции для фильтрации строк, где speed равно 0 и чья «следующая» строка тоже имеет 0 speed:

select id_veic, dat_posi, lat, longi, speed, gmt
from (
    select l.*, lead(speed) over(partition by id_veic order by date_posi) lead_speed
    from literal_view l
) t
where not (speed = 0 and lead_speed = 0)

Вы можете легко изменить запрос на фильтровать по заданному диапазону дат и / или транспортному средству, добавив в подзапрос предложение where.

...