【问题标题】:Query to get only cars inside car park查询仅获取停车场内的汽车
【发布时间】:2020-12-01 02:18:16
【问题描述】:

我想从停车场做一份报告,并在我调用查询时通过这个停车场获取里面的汽车。

假设我们有两个入口和两个出口,我如何在 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 来自出口,所以我们拥有的最后一条记录是来自出口车道。

有了这些信息,你能指导我做这个查询吗?

【问题讨论】:

  • 如何知道一辆车是在车内还是车外?您应该记录汽车的方向
  • @GordonLinoff 因为车道 1 是从入口处,而车道 3 是出去。因此,如果我们有车道 1 的记录,我们知道汽车在里面,但在这种情况下,最后一条记录来自车道 3,所以汽车在外面
  • 但是你有两个入口和两个出口,你只提到了两条车道。

标签: sql sql-server database report


【解决方案1】:

您应该存储汽车是否进入或离开。对于这样的应用程序来说,这似乎很基本。

如果没有,您可以计算到给定时间的记录数,如果该值是奇数,则汽车进入甚至退出。所以要让汽车进入:

select lic_plate
from t
where date < @date
group by lic_plate
having count(*) % 2 = 1;

如果您有入口和出口车道,您可以使用相关子查询获取最后一条记录并检查最终的 lance:

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

【讨论】:

  • 感谢 Gordon,按照您的指示,加上我需要在报告中显示的列日期,我得到了所有值。如果我添加 t.lane = 1 和 t.lane = 2,您给我的第二个选项,我会得到更多不正确的值。但我仍在调查谢谢!
【解决方案2】:

要获取每个“lic_plate”的最后一个“通道”是通道 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 2023-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多