Am 03.10.22 um 14:13 schrieb Luca Bertoncello:
> Irgendwie habe ich jetzt eine Denkfehler und komme nicht weiter...
> [...]
> Mit dieser Anfrage hole ich die Flugplatzdaten zusammen mit den
> Koordinatendifferenzen:
> 
> SELECT *,
>        ABS(latitude - 51.04952025) AS latdiff,
>        ABS(longitude - 13.68193347) AS lngdiff
> FROM airports;
> 
> Nun will ich den Datensatz finden, bei dem latdiff = MIN(latdiff) und
> lngdiff = MIN(lngdiff).

Ähh, nein. Diesen Flughafen gibt es wahrscheinlich nicht. Du willst
nicht den künstlichen Flughafen, der aus dem minimalen horizontalen und
minimal vertikalen Abstand zu einem Bezugspunkt besteht (das sind
nämlich aller Wahrscheinlichkeit nach zwei verschiedene Flughäfen!),
sondern den, bei dem die Summe der Quadrate beider Werte am kleinsten
ist (Pythagoras, Hypotenuse und so).¹

> So wäre meine Anfrage:
> 
> SELECT *,
>        ABS(latitude - 51.04952025) AS latdiff,
>        ABS(longitude - 13.68193347) AS lngdiff
> FROM airports
> GROUP BY id
> HAVING latdiff = min(latdiff) AND lngdiff = min(lngdiff);
> 
> Aber das gibt mir völlig flasche Ergebnisse, denn die Koordinaten, die
> ich hier nutze, sind in Dresden Cotta und der Flughafen Aachen ist
> deutlich weiter als den Flughafen Dresden, von mir gesehen...
> 
> Kann jemand mir sagen, wo mein Denkfehler liegt?

Mein SQL ist schon arg eingerostet, aber eventuell das (ungetestet!):

  SELECT *,
         latitude  - 51.04952025 AS latdiff,
         longitude - 13.68193347 AS lngdiff
  FROM airports
  ORDER BY latdiff*latdiff + lngdiff*lngdiff
  LIMIT 1;

Durch die Multiplikation können wir uns auch das ABS() sparen.

Viele Grüße,
Mathias

¹ Ja, ich ignoriere wohl wissend, dass die Erde rund^Wbuckelig ist :P

Attachment: OpenPGP_signature
Description: OpenPGP digital signature

Antwort per Email an