2014-12-31 4 views
0

Я пытаюсь создать выбор матрицы происхождения/назначения с помощью SQL Server 2008. Я хочу найти ближайшие 5 сайтов на любом данном сайте.SQL Server 2008: Пространственный запрос - возврат 5 ближайших сайтов

Матрица должна содержать идентификатор происхождения, идентификатор назначения и расстояние между ними. До сих пор мне удалось получить что-то, работающее на одном сайте, но я хочу перебирать каждую строку в моей таблице. Я ударил стену, чтобы выяснить, как это сделать, может ли кто-нибудь помочь? Я только хочу вернуть пункт назначения, если он находится в пределах 2,5 км от места происхождения.

Рабочий код для моего одного происхождения сайта ниже (я хочу тот же результат, но в том числе и все строки, как происхождения):

SP_Geometry моя география колонка (MapInfo названия этого столбца по умолчанию при использовании EasyLoader)

DECLARE @Point1 AS Geography 
DECLARE @Point1ID AS Nvarchar (255) 
SELECT @Point1=SP_Geometry FROM SitesTable WHERE Label = 'ID1' 
SELECT @Point1ID = Label FROM SitesTable WHERE Label = 'ID1' 

SELECT TOP 5 
@Point1ID AS Origin 
,@Point1 AS Origin_SP_Geometry 
,@Point1.STDistance(SP_Geometry) AS Distance 
,@Label AS Destination 
,SP_Geometry AS Destination_SP_Geometry 

FROM SiteTable 
WHERE @Point1.STDistance(SP_Geometry) <2500 
ORDER BY @Point1.STDistance(SP_Geometry) 

Выполнение вышеуказанных результатов в следующем отборе:

+--------+---------------------+-------------+-------------+----------------------------+ 
| Origin | Origin_SP_GEOMETRY | Distance | Destination | Destination_SP_GEOMETRY | 
+--------+---------------------+-------------+-------------+----------------------------+ 
| ID1 | 0xE6100000010CDD(…) | 0   | ID1   | 0xE6100000010CDD772D9D(…) | 
| ID1 | 0xE6100000010CDD(…) | 395.7739586 | ID867  | 0xE6100000010C2466CDFA5(…) | 
| ID1 | 0xE6100000010CDD(…) | 407.6394398 | ID2500  | 0xE6100000010C6FBC54(…) | 
| ID1 | 0xE6100000010CDD(…) | 1033.827269 | ID91  | 0xE6100000010C3981C0353(…) | 
| ID1 | 0xE6100000010CDD(…) | 1082.667065 | ID1540  | 0xE6100000010CD03BFCD2(…) | 
+--------+---------------------+-------------+-------------+----------------------------+ 

в идеале это именно то, что я хочу, но у меня возникают проблемы е установление любого типа цикла (который должен был объединять исходный код ID2, ID3 и т. д.)

Любая помощь была бы высоко оценена!

ответ

0

Попробуйте использовать функцию RANK. Я не могу тестировать, так как у меня нет выборочных данных, поэтому это может потребоваться, но должно быть близко ...

;WITH cteDistances AS (
    SELECT 
     origin.Label AS OriginId 
     ,dest.Label AS DestinationId 
     ,origin.SP_Geometry.STDistance(dest.SP_Geometry) AS Distance 
     ,RANK() OVER (PARTITION BY origin.Label ORDER BY origin.SP_Geometry.STDistance(dest.SP_Geometry)) AS DistanceRank 
    FROM 
     SiteTable origin 
     INNER JOIN SiteTable dest ON (dest.Label <> origin.Label) 
    WHERE 
     origin.SP_Geometry.STDistance(dest.SP_Geometry) < 2500 
)  

SELECT 
    OriginId, DestinationId, Distance 
FROM 
    cteDistances 
WHERE 
    DistanceRank <= 5 
+0

Это работает отлично! Спасибо. –

Смежные вопросы