-- Test initialization
DECLARE @CocoJambo TABLE (
AddressID INT PRIMARY KEY,
SpatialLocation geography NOT NULL
);
INSERT INTO @CocoJambo (AddressID,SpatialLocation)
VALUES
(11, 'POINT (-122.164644615406 47.7869921906598)'),
(22, 'POINT (-122.250185528911 47.6867097047995)'),
(33, 'POINT (-122.274625789912 47.7631154083121)'),
(44, 'POINT (-122.335726442416 47.7392386259644)'),
(55, 'POINT (-122.091323832402 47.7010357742081)'),
(66, 'POINT (-122.360166703417 47.7058111306776)'),
(77, 'POINT (-122.335726442416 47.7631154083121)'),
(88, 'POINT (-122.372386833918 47.7440139824339)'),
(99, 'POINT (-122.189084876407 47.7201372000862)'),
(100, 'POINT (-122.042443310399 47.7822168341902)');
-- End of Test initialization
-- Test 1 (SQL Server 2008 >=)
DECLARE @Results TABLE (
RowNum INT PRIMARY KEY,
SpatialLocation geography NOT NULL
);
INSERT @Results (RowNum, SpatialLocation)
SELECT ROW_NUMBER() OVER(ORDER BY t.AddressID) AS RowNum, t.SpatialLocation
FROM @CocoJambo t;
SELECT SUM(crt.SpatialLocation.STDistance(prev.SpatialLocation)) AS SumOfDistance1
FROM @Results crt INNER JOIN @Results prev ON crt.RowNum=prev.RowNum+1;
-- End of Test 1 (SQL Server 2008 >=)
-- Test 2 (SQL Server 2012)
SELECT SUM(x.CurrentLocation.STDistance(x.PreviousLocation)) AS SumOfDistance2
FROM (
SELECT
t.SpatialLocation AS CurrentLocation,
LAG(t.SpatialLocation) OVER(ORDER BY t.AddressID) AS PreviousLocation
FROM CocoJambo T
) x
-- End of Test 2 (SQL Server 2012)
結果:
SumOfDistance1
----------------------
102946.467827877
SumOfDistance2
----------------------
102946.46782787738
Demo SQLFiddle爲SQL 2012的版本
參考文獻: