Zum Inhalt springen

Join über ähnliche Werte


FinalFantasy

Empfohlene Beiträge

Ich habe zwei Tabellen, die ich über einen Wert verbinden will. Jedoch sind die Werte nicht gleich, es sind allerdings Zahlen.

Ich will die Tabelle jetzt mit dem nächstgelegenen Wert in der anderen Tabelle verbinden.

Beispiel:


Tabelle A:
Idx | Wert
1 | A
2 | B
5 | C
9 | D

Tabelle B:

Idx | Wert
1 | a
4 | b
7 | c
8 | d
[/PHP]

Ich nehme Tabelle A als Basis, mit diesem Pseudeselect:

[PHP]
SELECT A.Wert, B.Wert FROM A, B WHERE A.Idx = B.Idx AND A.Idx = 2

Das liefert mir natürlich "A a" als Ergebnis.


SELECT A.Wert, B.Wert FROM A, B WHERE A.Idx = B.Idx AND A.Idx = 5
[/PHP]

Das geht natürlich so nicht. Ich hätte jetzt aber gern als Ergebnis, dass er dann aus Tabelle B einfach den nächstgelegenen Wert nimmt. In diesem Fall wäre das B.Idx 4, das Ergebnis also "C b". Sollten zwei B-Werte exakt gleich weit entfernt sein, hätte das Ergebnis zwei Sätze.

Die größe Frage: Ist sowas direkt in SQL möglich (in einem einzigen Select), oder muss ich mir da selbst etwas basteln?

Ich benutze SQLite3.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Verstehe ich das richtig, dass Du so etwas haben willst wie ein ceil?

D.h. er soll den nächsten Wert >= finden und damit verknüpfen?

Sollte dann so aussehen (ungetestet)


select * from A JOIN B ON B.idx >= A.idx 

Ein Join hat ja eine Condition über die er die Daten verknüpft, da kann man natürlich auch andere Verknüpfungsoperatoren nehmen. Bei SQLite ist man natürlich etwas vom Syntax etwas eingeschränkt.

Vielleicht kannst Du das Problem etwas anschaulicher schildern

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nein, so funktioniert das nicht ganz. Abgesehen davon, dass dein Select alle Einträge aus B mit größerem Wert liefert, also nicht nur einen Datensatz, sondern viele, will ich den am nähest gelegenen Wert, der kann mal größer sein, aber auch eben ein kleinerer.

Konkreter Fall, ich habe zwei Tabellen mit Timestamps. Die Daten in beiden Tabellen stammen von unterschiedlichen Quellen, es wäre also purer Zufall, wenn Timestamps in beiden Tabellen exakt gleich sind. Ich will diese Werte aber zueinander zuordnen.

Ich sage mal, Tabelle A ist meine priorisierte Tabelle und ich will jetzt aus Tabelle B den Datensatz der zeitlich am nähesten an dem in Tabelle A liegt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich sage mal, Tabelle A ist meine priorisierte Tabelle und ich will jetzt aus Tabelle B den Datensatz der zeitlich am nähesten an dem in Tabelle A liegt.

Ich denke da wirst Du gerade bei SQLite nichts passendes finden. Ich würde das über eine weitere Tabelle lösen, bei der die entsprechenden Datensätze verknüpft werden. D.h. Du musst, wenn Du die Timestamps einfügst direkt den passenden "nächsten" Datensatz suchen.

In einem anderen DBMS würde ich das über eine Stored Procedure lösen, die mir immer den nächsten Datensatz sucht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

SQLite ist zwar echt schön, wenn man etwas out-of-box braucht, aber für komplexere Sachen sieht es da einfach schlecht aus. Was evtl gehen würde, wenn SQLite Subselects unterstützt, dass Du so etwas machen würdest:

select * from A Join B on A.idx=(select idx from B where idx>=A.idx limit 1)

Der Subselect würde durch das limit genau einen oder keinen Datensatz liefern, der >= den Wert von A ist. Ggf wäre es da ratsam auf der Mailingliste direkt nach zu fragen http://www.sqlite.org/support.html

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, das ist mir klar, nur das liefert mit unter Umständen einen Datensatz aus B der erst 10 Sekunden später aufgenommen wurde, obwohl der vorherige vielleicht nur 0,1 Sekunde weit weg wär. Und genau das will ich nicht.

Du musst doch nur das Minimum der nächsten Beträge der Datensätze bestimmen !? ABS und MIN müsstest Du nur verwenden

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ne, das funktioniert so leider nicht. Ich versuch noch ein Beispiel:

In Tabelle A hab ich einen Datensatz, mit sagen wir 15:00 Uhr.

In Tabelle B sind jetzt die Datensätze:

14:59

15:31

16:47

in diesem Fall will ich als Ergebnis die 14:59 haben, weil es ma nähesten an 15:00 liegt.

Anderer Fall für Tabelle B:

14:21

15:09

15:36

In diesem Fall will ich die 15:09 als Ergebnis kriegen.

Ist das verständlicher?

Link zu diesem Kommentar
Auf anderen Seiten teilen

jaaaa, jetzt versteh ich was du gemeint hast... :D

genau, man kann das via SQL recht elegant so erledigen, dass man eben das ganze Betragsweise (abs) berechnet und über die Ergebnismenge das Minimum (min) bildet. Durch den Betrag fallen die Vorzeichen der Differenzen weg und Min liefert dir dann den kleinsten Wert

Du solltest halt so weit wie möglich immer mengenorientiert arbeiten, d.h. berechne die Differenzen zu allen Datensätzen aus und bildet Betrag und Minimum der Menge

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...