我需要从三个表中获取信息,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] 删除。
我来说两句