簡體   English   中英

如何按最接近的數值更新

[英]how to update by the closest numeric value

我有兩個表Cities_no_iata這個表有列(CountryID,iata_code,latitude,longtiute)

Cities_iata此表包含列(CountryID,iata_code,latitude,longtiute)

第一個表包含沒有iata_code的城市,因此iata_code列中的所有行都為null

第二個表包含具有iata_code的城市

所以我想將最近的城市iata_code復制到沒有iata_code的城市,我想通過2件事做到這一點

1-兩個城市最近的(緯度和經度)

2-兩個城市的相同CountryID。

Update Cities_iata
JOIN Cities_no_iata USING (CountryID)
Where ABS( cities_iata.latitude)= ABS(Cities_no_iata.latitude)
AND  ABS( cities_iata.longitude)= ABS(Cities_no_iata.longitude)
AND cities_iata.CountryID = Cities_no_iata.country_id
set(   Cities_no_iata.iata_code =cities_iata.iata_code);

但是不行

該查詢使用歐幾里德公式近似距離。 實際上,即使是近似值,您也需要考慮緯度的單位差異與經度的不同,具體取決於緯度 - 這需要將緯度差乘以余弦。

但是,我將假設問題實際上是找到最接近的,而不是特定的距離公式。 以下查詢返回表中沒有的城市最近的iata代碼:

select cni.*,
       (select iata_code
        from cities_iata ci
        order by pow(cia.latitude - ci.latitude, 2) + pow(cia.longitude - ci.longitude, 2)
        limit 1
       ) as new_iata_code
from cities_no_iata cni;

我們可以使用join將其轉換為update

update cities_no_iata join
       (select cni.*,
               (select iata_code
                from cities_iata ci
                order by pow(cia.latitude - ci.latitude, 2) + pow(cia.longitude - ci.longitude, 2)
                limit 1
               ) as new_iata_code
        from cities_no_iata cni
       ) upd
       on cities_no_iata.latitude = upd.latitude and
          cities_no_iata.longitude = upd.longitude
     set iata_code = upd.iata_code;

兩條評論。 您可以在order by子句中放置您喜歡的任何距離函數,因此這應該概括為您想要的。 其次,每行應該有一個唯一的標識符,因此最終的連接可以使用城市標識符而不是緯度和經度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM