问题描述
我想从一个停车场中生成报告,并使用该停车场获取我致电查询时所处的车厢。
假设我们有两个入口和两个出口,那么我该如何用SQL来仅使停车场内的汽车进入。
如何获取这些值?
我的表的记录示例:
id lic plate date lane access id_user
__________________________________________________________________
10 1234-BK 2020-08-11 12:24:00.000 1 OK 4
11 1234-BK 2020-08-11 12:25:00.000 3 OK 4
在该示例中,我们假设这辆车不在停车场内,因为1号车道是从入口进入的,而3号车道是从出口出来的,所以我们拥有的最后一条记录是在出口车道上。
有了这些信息,您是否可以定向我进行此查询以将所有汽车都放入里面?
解决方法
您应该存储汽车是进入还是离开。对于这样的应用程序,这似乎很基本。
如果没有,您可以计算到给定时间的记录数,并且如果该值是奇数,则表示汽车已驶入甚至已驶出。所以要把车放进去:
select lic_plate
from t
where date < @date
group by lic_plate
having count(*) % 2 = 1;
如果您有出入口车道,则可以使用相关的子查询获取最后一条记录,并检查最终的长矛:
select t.*
from t
where t.date = (select max(t2.date)
from t t2
where t2.lic_plate = t.lic_plate and
t2.date < @date
) and
t.lane = 1; -- last lane is an entrance lane
,
要获取行,其中每个“ lic_plate”的最后一个“ lane”是泳道1,OP可以使用开窗功能。
;with get_max_cte as (
select t.*,ROW_NUMBER() over (partition by lic_plate order by t.[date] desc) rn)
select * from get_max_cte
where rn=1 and lane=1