在select语句中处理记录

时间:2014-01-15 06:59:24

标签: oracle

我有一张表格,里面有记录或通过地方的卡片

ID: int
CarPlate: int
PassDate: date
PassType: byte > 1 enter, 2 exit

我想按日期选择每辆车在该地方的总时间 现在这是我的策略,但我无法实现它。

在卡片进入和退出的特定日期进行成像如下:

    1- enter >
    2- enter >
    3- < exit
    4- enter >
    5- < exit
 

这辆特别的车进了3次并且退出了两次,我只想要背靠背的进入和退出所以我需要在特定日期选择所有卡的所有进入然后每次进入检查是否有是下一次进入或不进入之前的出口,并继续到每个板块的末端,然后是下一个板块。

我在实施这个通过板块的过程中遇到了问题 最后的结果应该是这样的

CarPlate | Date | EnterExit | Duration

此EnterExit是一系列进入和退出的集合

    enter at ..... exit at .....
    enter at ..... exit at .....
    enter at ..... exit at .....
    enter at ..... exit at .....

1 个答案:

答案 0 :(得分:0)

这样的事情:

select carplate,
       enter_time, 
       exit_time, 
       exit_time - enter_time as duration
from (
  select carplate, 
         passtype, 
         passdate,
         case
           when passtype = 'exit' then lag(passdate) over (partition by carplate order by passdate)
           else null
         end as enter_time,
         case 
           when passtype = 'exit' then passdate
           else null
         end as exit_time, 
         case 
            when lag(passtype) over (partition by carplate order by passdate) <> passtype then 1
            else 0
         end as valid
  from cars
  order by carplate, passdate
) t
where valid = 1 
  and passtype = 'exit';

(我将您的值12替换为'enter''exit',以使查询更具可读性。

这会计算连续行的输入/退出时间,然后只选择exit之后enter出现的那些。

这是一个SQLFiddle:http://sqlfiddle.com/#!4/df6c0/1