2

私は2つのテーブルを持っています:

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 と Haversine 関数の結果の両方を取得したいと思います。どうすれば効率的にそれを行うことができますか?

4

3 に答える 3

2
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);

このクエリは、たとえば 2 つの STOP までの最小距離が等しい場合、1 つの GPS 位置に対して複数の行を選択できることに注意してください。主なパフォーマンスの問題は、最初のクエリ (一時 #Distance テーブルの作成) にあります。

出力テーブルを減らすには、WHERE ステートメントを使用してこのクエリを最適化する必要があると思います。たとえば、GPS 位置から任意の STOP 位置までの最大許容距離を設定し、WHERE dbo.Haversine(Latitude,Longitude,StopLat,StopLon)<MAX_ALLOWED_DISTANCE.

于 2012-08-02T12:49:00.363 に答える
0

geographySQL Server 2008 を使用している場合は、組み込みのデータ型を使用して GPS と STOP ポイントを保存し、組み込みのSTDistance関数を使用して距離を測定することをお勧めします。

于 2012-08-02T08:13:53.913 に答える
0

このクエリは機能するはずです:

SELECT  Gps.*, Stops.*
FROM    Gps
JOIN    Stops   
        ON (dbo.Haversine(Latitude, Longitude, StopLat, StopLon) 
            = (SELECT MIN(dbo.Haversine(Latitude, Longitude, s2.StopLat, s2.StopLon))
                FROM    Stops As s2
            ) )

でも、速くならないのは確かです。


動作するはずの別の方法を次に示します。

;WITH
  cte As
(
    SELECT  Gps.*, Stops.*,
            dbo.Haversine(Latitude, Longitude, StopLat, StopLon) As distance,
            MIN(dbo.Haversine(Latitude, Longitude, StopLat, StopLon))
                    OVER(Partition By Latitude, Longitude)       As minDistance
    FROM    Gps
    CROSS JOIN
            Stops
)
SELECT  *, distance
FROM    cte
WHERE   distance = minDistance

それでも同じくらい遅いです。

于 2012-08-02T03:15:01.300 に答える