Access数据库的SQL

时间:2019-05-10 11:17:13

标签: sql ms-access

我正在处理大量的交通数据。我想在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 :(得分:0)

假设帧ID没有间隙,则可以使用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;

否则,这将是一个非常昂贵的查询。

答案 1 :(得分:0)

您可以使用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
  )