2016-11-07 6 views
1

Я работаю над проблемой грузоперевозок, где у меня есть несколько распределительных центров (DC) и несколько магазинов. У меня есть долгота и широта как для DC, так и для магазинов. Я не уверен, как пройти через 47 разных долготы и широты DC, а 4500+ - хранить долготу и широту, а затем находить кратчайшие расстояния каждого из них. Я думал, что-то вроде этого (но я думаю, что временная таблица неправильно):Найти несколько расстояний в SQL с помощью цикла

CREATE TEMPORARY TABLE tempStores AS (SELECT * FROM wm_stores) 

SET i = 0; 
WHILE i <= (SELECT COUNT(*) FROM tempStores) - 1 DO 
    SELECT store_id FROM tempStores LIMIT i,1 INTO thisStoreID; 
    SELECT store_id FROM tempStores LIMIT i,1; 

    SET i = i + 1; 
END WHILE; 

DECLARE storeLat DOUBLE; 
DECLARE storeLon DOUBLE; 
DECLARE dcLat DOUBLE; 
DECLARE dcLon DOUBLE; 
DECLARE storeLatRad DOUBLE; 
DECLARE storeLonRad DOUBLE; 
DECLARE dcLatRad DOUBLE; 
DECLARE dcLonRad DOUBLE; 
DECLARE R DOUBLE; 
DECLARE distance DOUBLE; 
SET R = 3961;      
SET storeLat = 37.350659; ## <-- Basically Loop this here 
SET storeLon = -76.734855; ## <-- Here 
SET dcLat = 37.192498;  ## <-- Here 
SET dcLon = -77.534201;  ## <-- And here... instead of having it all hard coded. 
SET storeLatRad = PI() * storeLat/180.0;  
SET storeLonRad = PI() * storeLon/180.0;  
SET dcLatRad = PI() * dcLat/180.0;   
SET dcLonRad = PI() * dcLon/180.0;  

ответ

0

Так что вам нужно, для каждого магазина, определить ближайший распределительный центр?

Для получения этой информации нам нужно знать расстояние между каждым магазином и каждым центром распределения; Вы предлагаете сделать это в цикле, но если вместо этого вы просто позволите SQL сделать это и поместите все данные во временную таблицу (или подзапрос), то я бы предложил, что логика схемы будет выглядеть примерно так:

SELECT y.StoreID, z.DCID, y.ClosestDCDistance as Distance 
FROM (
    SELECT StoreID, Min(StoreDCDistance) as ClosestDCDistance 
    FROM (SELECT StoreID, DCID, StoreDCDistance FROM TempTable) x 
    GROUP BY StoreID 
) y INNER JOIN ( 
    SELECT StoreID, DCID, StoreDCDistance FROM TempTable 
) z ON y.StoreID = z.StoreID AND y.ClosestDCDistance = z.StoreDCDistance 

Вы можете убрать это с помощью CTE, если хотите. Независимо от того, что требуется, нужно заполнить TempTable (или сделать эту логику подзапросом, если хотите);

SELECT StoreID, DCID, (???) as StoreDCDistance INTO TempTable 
FROM wm_Stores st, wm_DCs dc  -- haven't got name of DCs table 

Я не знаю, как рассчитать расстояние, которое я поставил как ??? в скобках, но, вероятно, у вас уже есть эта информация. Я предполагаю, что уравнение достаточно для вычисления расстояния от LatA, LngA до LatB, LngB - хотя я не ожидал, что уравнение будет простым A + B = C. Учитывая то, что вы получили выше

(PI() * st.storeLat/180), очевидно, является одной его небольшой составляющей, но я не могу догадаться, что еще требуется, и ваш пост не показывает никакого вычисления общего расстояния.

Если одно уравнение не может выполнить весь расчет, вам нужно будет использовать функцию для вычисления расстояния, заданного значениями LatA, LngA, LatB & LngB.

Надеюсь, это поможет.