SQL 服务器:return 一天中最近时间的坐标
SQL Server : return coordinates for nearest time of day
我需要三个 table 的信息,Machine、MachineActivity 和 LocationHistory。 Machine table 提供有关机器的信息,例如 MachineNumber。 MachineActivity 在给定的一天中提供有关 activity 的信息,最后 LocationHistory 仅存储一天中的机器位置时间。
我写了一个视图,可以获取给定日期的机器信息和 return 它们从早上 6 点之前的位置历史记录。问题是有些机器在早上 6 点之后有位置,在这种情况下我仍然想要位置数据 returned,所以我需要的是 return 最接近早上 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')
这就是我目前的状态。我知道它可能需要一个子查询,基本上就是这个 question。但是,我似乎无法将这个问题转化为我的场景,事实上它是用 PostgreSQL 编写的,当这是 SQL 服务器时没有帮助。
横向连接(apply
在 SQL 服务器中)似乎是合适的。根据您的描述:
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)
,除非您完全理解它的作用——包括它可以 return 脏的、不一致的数据这一事实。
我需要三个 table 的信息,Machine、MachineActivity 和 LocationHistory。 Machine table 提供有关机器的信息,例如 MachineNumber。 MachineActivity 在给定的一天中提供有关 activity 的信息,最后 LocationHistory 仅存储一天中的机器位置时间。
我写了一个视图,可以获取给定日期的机器信息和 return 它们从早上 6 点之前的位置历史记录。问题是有些机器在早上 6 点之后有位置,在这种情况下我仍然想要位置数据 returned,所以我需要的是 return 最接近早上 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')
这就是我目前的状态。我知道它可能需要一个子查询,基本上就是这个 question。但是,我似乎无法将这个问题转化为我的场景,事实上它是用 PostgreSQL 编写的,当这是 SQL 服务器时没有帮助。
横向连接(apply
在 SQL 服务器中)似乎是合适的。根据您的描述:
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)
,除非您完全理解它的作用——包括它可以 return 脏的、不一致的数据这一事实。