SQL Server:返回一天中最近时间的坐标

库利莫勒

我需要从三个表中获取信息,Machine、MachineActivity 和 LocationHistory。Machine 表提供有关机器的信息,例如 MachineNumber。MachineActivity 提供给定日期期间的活动信息,最后 LocationHistory 仅存储一天中的机器位置时间。

我写了一个视图,它获取给定日期的机器信息,并从早上 6 点之前返回它们的位置历史记录。问题是有些机器在早上 6 点之后有位置,在这种情况下我仍然希望返回位置数据,所以我需要的是返回最接近早上 6 点但不一定小于早上 6 点的可用时间的位置坐标。

SELECT DISTINCT
    MA.ActivityDate,
    M.MachineNumber,
    LH.Latitude,
    LH.Longitude
FROM 
    Machine M WITH(NOLOCK)
JOIN 
    MachineActivity MA WITH(NOLOCK) ON MA.MachineId = M.Id 
JOIN 
    LocationHistory LH WITH(NOLOCK) ON LH.MachineActivityId = MA.Id
WHERE
    (CAST(LH.LocationTime AS Time) < '06:00:00')

这就是我目前所处的位置。我知道它可能需要一个子查询,基本上就是这个问题但是,我似乎无法将这个问题转换为我的场景,当这是 SQL Server 时,它是用 PostgreSQL 编写的这一事实并没有帮助。

戈登·利诺夫

横向连接(apply在 SQL Server 中)似乎很合适。从你的描述来看:

SELECT MA.ActivityDate, M.MachineNumber, LH.Latitude, LH.Longitude
FROM Machine M JOIN
     MachineActivity MA 
     ON MA.MachineId = M.Id CROSS APPLY
     (SELECT TOP (1)
      FROM LocationHistory LH 
      WHERE LH.MachineActivityId = MA.Id
      ORDER BY ABS(DATEDIFF(SECOND, CONVERT(TIME, LH.LocationTime), CONVERT(TIME, '06:00:00') ))
     ) LH;

注意:WITH (NOLOCK)除非您完全了解它的作用,否则不应使用它——包括它可能返回脏的、不一致的数据这一事实。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章