Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Vorherigen Wert aus einer Tabelle bestimmen (https://www.delphipraxis.net/198685-vorherigen-wert-aus-einer-tabelle-bestimmen.html)

Trafel21 23. Nov 2018 10:41

Datenbank: firebird • Version: 2.5 • Zugriff über: Delphi XE

Vorherigen Wert aus einer Tabelle bestimmen
 
Hallo zusammen

Angenommen ich hab eine Tabelle mit Zahlenwerten.
  1. ...
  2. 74
  3. 88
  4. 97
  5. 105
  6. 110
  7. ...

Weiß jemand einen Algorithmus, wie ich den vorherigen Wert mit select bestimmen kann?

Bsp: von Wert 105 -> mit select 97
oder von Wert 110 -> mit select 105 ... etc

Ich hätte an ein Select mit Schleife gedacht, da ich relativ neu in SQL bin, bin ich mir unsicher ob das überhaupt funktioniert.

mkinzler 23. Nov 2018 10:48

AW: Vorherigen Wert aus einer Tabelle bestimmen
 
Wenn die Tabelle eine ID als Primärschlüssel hat:

SQL-Code:
select
  first 1 
from
  <Tabelle> where id < :id
order by id desc;

Uwe Raabe 23. Nov 2018 11:00

AW: Vorherigen Wert aus einer Tabelle bestimmen
 
Ich vermute mal, daß es hier um die nach aufsteigenden Werten sortierte Tabelle handelt und du den nächst-kleineren Wert haben willst?

Nehmen wir an, die Tabelle heißt "TabValues", das Feld "FldValue" und der Parameter für den aktuellen Wert heißt "CurValue".

In dem Fall sollte ein
SQL-Code:
SELECT MAX(FldValue)
FROM TabValues
WHERE FldValue < :CurValue

hoika 23. Nov 2018 11:02

AW: Vorherigen Wert aus einer Tabelle bestimmen
 
Hallo,
Zitat:

relativ neu in SQL
Dann erst mal herzliche willkommen.
MKinzler benutzt hier gleich mehrere spezielle SQL-Konstrukte.

order by id desc;
Sortiere absteigend (descending), als die größten zuerst
Ergebnis:
110
105
97
88
74

where id < :id
nur die, die kleiner als id sind
id=105
Ergebnis:
97
88
74

first 1
nur den ersten Wert zurückgeben
Ergebnis:
97

dada

Das first 1 hättest du auch weglassen können, weil der erste Eintrag ja die 97 ist,
aber warum 3 Records übers Netz schubsen, wenn Du weißt, dass Du nur den ersten brauchst.

mkinzler 23. Nov 2018 11:07

AW: Vorherigen Wert aus einer Tabelle bestimmen
 
@uwe: Ist zwar im Beispiel zwar so, in der Praxis aber selten.

@Heiko: Ich dachte eine ID unabhängig von den Werten. Und
SQL-Code:
First 1
bewirkt, dass nur ein datensatz über das Netz geht.

Uwe Raabe 23. Nov 2018 11:29

AW: Vorherigen Wert aus einer Tabelle bestimmen
 
Zitat:

Zitat von mkinzler (Beitrag 1418920)
@uwe: Ist zwar im Beispiel zwar so, in der Praxis aber selten.

Das hängt aber doch stark von der aktuellen Fragestellung ab. In diesem Fall ist zwar nirgendwo die von mir gewählte Formulierung erwähnt (deswegen steht sie ja auch da), aber es ist auch nirgendwo erwähnt, daß das Beispiel nach ID oder Recordnummer sortiert ist. Das gegebene Beispiel lässt beide Problemstellungen zu.

p80286 23. Nov 2018 16:44

AW: Vorherigen Wert aus einer Tabelle bestimmen
 
Zitat:

Zitat von Trafel21 (Beitrag 1418912)
Weiß jemand einen Algorithmus, wie ich den vorherigen Wert mit select bestimmen kann?

In einer Datenbank gibt es kein "vorher/nachher"!
Was man abfragen kann ist der Datensatz der als letzter vor einem anderen erfasst worden ist, wenn ein etsprechendes Datumfeld/timestamp existiert. Oder den direkten Vorgänger oder Nachfolger eines datensatzes wenn auf oder absteigend nach einem bestimmten Feldinhalt sortiert wird.

Gruß
K-H

jobo 23. Nov 2018 21:37

AW: Vorherigen Wert aus einer Tabelle bestimmen
 
Zitat:

Zitat von p80286 (Beitrag 1418970)
In einer Datenbank gibt es kein "vorher/nachher"!..

Ich schließe mich da an!

Es mag vielleicht haarspalterisch klingen und man meint die Frage ist doch klar, Werte aus der Zeile "davor"..
Naja, kann sein, könnte aber auch anders gemeint sein.

Du bist natürlich nicht der einzige, der sowas gebrauchen könnte und wenn Du Deine DB von 2.5 auf Version 3 hochziehst, dann bekommst Du, was Du willst:
http://www.firebirdsql.org/file/docu...ndowfuncs.html
Wenn Du "Anfänger" bist, ist die Version Deiner DB ja wahrscheinlich eher Zufall oder Resultat einer Paketinstallation als Absicht.

Mit den Funktionen aus dem Link kann man nette Sachen machen. Es ist zwar, wie man z.B. an firebird sieht, nicht in jeder Db möglich, aber wird mehr und mehr Standard.

Damit kannst Du dann Zugriffe, die man aus Spreadsheetfunktionen kennt, auch in einer DB verwenden, die im "Normalbetrieb" einfach mit unsortierten Mengen arbeitet.
Wie man an den Beispielen im Link sieht, geht es allerdings nicht nur um ein stumpfes "Order by", das gibt's ja schon.
Die Window Functions erlauben der DB auch eine wesentlich bessere Optimierung der Abfrage, die Abfragen sind viel schneller, als die Workarounds, die bis vor Kurzem bspw. noch in fb oder mysql nötig waren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz