我有一张表格,里面有记录或通过地方的卡片
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 .....
答案 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';
(我将您的值1
和2
替换为'enter'
和'exit'
,以使查询更具可读性。
这会计算连续行的输入/退出时间,然后只选择exit
之后enter
出现的那些。
这是一个SQLFiddle:http://sqlfiddle.com/#!4/df6c0/1