sql - 连接以获取行匹配函数的最小值

标签 sql sql-server-2008 t-sql

我有两个表:

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/

相关文章:

SQL - 选择一个字段中具有来自另一字段的最高记录的不同记录

sql-server - SQL Server : Second maximum value per group

SQL Group by 和 concat

sql - 为什么 SQL Server 标量值函数变得更慢?

sql - 如何在 SQL Developer 中为查询结果设置替换变量?

SQL Server 2008 分区表和并行性

sql-server - 如何在 .cfc 文件中的一个 DELETE 语句中从多个表中删除?

sql - UNIQUE会自动添加索引吗?

SQL 服务器 : BOM Recursion from the bottom up

sql-server - MDF 和 LDF 文件大小