2016-11-07 44 views
1

我正在處理一個卡車運輸問題,其中有多個分銷中心(DC)和多個商店。我對區議會和商店都有經度和緯度。我不知道如何循環47個不同的DC經線和緯度以及4500多個商店的經度和緯度,然後找到每個DC的最短距離。我想是這樣的(但我認爲,臨時表是錯誤的):使用循環在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值的距離。

希望這會有所幫助。