SQL для доступа к базе данных - PullRequest
0 голосов
/ 10 мая 2019

Я имею дело с огромным объемом данных трафика. Я хочу идентифицировать транспортные средства, которые изменили свои полосы движения в базе данных MS Access. Я хочу идентифицировать только те записи, которые изменили полосу движения (сразу две записи: до смены полосы движения и после смены полосы движения)

Данные о трафике:

Vehicle_ID   Lane_ID   Frame_ID      Distance  
        1        2        12            100  
        1        2        13        103  
        1        2        14        105  
        2        1        15        107  
     ***2        1        16        130  
        2        2        17        135***  
        2        2        18        136  
     ***3        1        19        140  
        3        2        20        141***  
        3        2        21        147  
        4        2        22        149  
     ***4        2        23        151
        4        1        24        154***
        4        1        25        159

С помощью отсюда я перебрал те идентификаторы Vehicle_ID, которые изменили свои полосы:

SELECT t.Vehicle_ID, COUNT(t.Lane_ID) AS [Lane Count]
FROM (
  SELECT DISTINCT Vehicle_ID, Lane_ID FROM Table1
) AS t
GROUP BY t.Vehicle_ID
HAVING COUNT(t.Lane_ID) > 1

Показанный результат:

Vehicle_ID  Lane Count  
       2    2  
       3    2  
       4    2  

Теперь я хочу провести дополнительный анализ с записями смены полосы движения, разделив сразу две записи: до и после смены полосы движения. Мой желаемый результат будет:

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

   Vehicle_ID   Lane_ID   Frame_ID      Distance  

     ***2        1        16        130  
        2        2        17        135***  
     ***3        1        19        140  
        3        2        20        141***  
     ***4        2        23        151
        4        1        24        154***

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Вы можете сделать это с помощью EXISTS:

select t.* from Table1 t
where 
  exists (
    select 1 from Table1
    where 
      vehicle_id = t.vehicle_id 
      and 
      frame_id in (t.frame_id - 1, t.frame_id + 1) 
      and 
      lane_id <> t.lane_id
  )
0 голосов
/ 10 мая 2019

Предполагая, что идентификаторы кадров не имеют пропусков, вы можете сделать это, используя join s:

select t1.*
from (table1 as t1 inner join
      table1 as t1prev
      on t1prev.Vehicle_ID = t1.Vehicle_ID and
         t1prev.frame_id = t1.frame_id - 1             
     ) inner join
     table1 as t1next
     on t1next.Vehicle_ID = t1.Vehicle_ID and
        t1next.frame_id = t1.frame_id + 1           
where t1prev.lane_id <> t1.lane_id or
      t1next.lane_id <> t1.lane_id;

В противном случае это будет очень дорогой запрос.

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