我有两个表:
CREATE TABLE [dbo].[Gps] (
[Date] [datetime] NOT NULL,
[Latitude] [decimal](9, 6) NOT NULL,
[Longitude] [decimal](9, 6) NOT NULL
)
CREATE TABLE [dbo].[Stops] (
[StopName] [varchar](128) NOT NULL,
[StopLat] [decimal](9, 6) NOT NULL,
[StopLon] [decimal](9, 6) NOT NULL
)
我想使用我用此签名编写的 Haversine() 标量函数为每个 Gps 条目获取最近的停止点:
CREATE FUNCTION [dbo].[Haversine]
(
@aLatitude DECIMAL(9, 6),
@aLongitude DECIMAL(9, 6),
@bLatitude DECIMAL(9, 6),
@bLongitude DECIMAL(9, 6)
)
RETURNS DECIMAL(16, 6)
示例:
SELECT dbo.Haversine(0.0, 0.0, 0.0, 0.0)
我想获取 StopName 以及半正矢函数的结果。我该如何有效地做到这一点?
最佳答案
select [Date],Latitude,Longitude,StopName,StopLat,StopLon, dbo.Haversine(Latitude,Longitude,StopLat,StopLon) as distance
INTO #Distances
from GPS,STOPS;
select * from #Distances d
join
(
select [Date],min(distance) minDist from #Distances group by [Date]
) B on (d.[date]=B.[date]) and (d.distance=b.minDist);
请注意,如果一个 GPS 位置与例如两个停靠点的最小距离相等,则此查询可以为一个 GPS 位置选择多行。主要的性能问题出现在第一个查询中(创建临时#Distance 表)。
我认为你应该通过WHERE语句优化这个查询以减少输出表。例如,您可以设置从 GPS 位置到任何停止位置的最大允许距离并添加 WHERE dbo.Haversine(Latitude,Longitude,StopLat,StopLon)<MAX_ALLOWED_DISTANCE
.
关于sql - 连接以获取行匹配函数的最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11769938/