AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Vorherigen Wert aus einer Tabelle bestimmen
Thema durchsuchen
Ansicht
Themen-Optionen

Vorherigen Wert aus einer Tabelle bestimmen

Ein Thema von Trafel21 · begonnen am 23. Nov 2018 · letzter Beitrag vom 23. Nov 2018
Antwort Antwort
Trafel21

Registriert seit: 16. Nov 2018
69 Beiträge
 
#1

Vorherigen Wert aus einer Tabelle bestimmen

  Alt 23. Nov 2018, 11:41
Datenbank: firebird • Version: 2.5 • Zugriff über: Delphi XE
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.

Geändert von Trafel21 (23. Nov 2018 um 11:44 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Vorherigen Wert aus einer Tabelle bestimmen

  Alt 23. Nov 2018, 11:48
Wenn die Tabelle eine ID als Primärschlüssel hat:

SQL-Code:
select
  first 1
from
  <Tabelle> where id < :id
order by id desc;
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#3

AW: Vorherigen Wert aus einer Tabelle bestimmen

  Alt 23. Nov 2018, 12:00
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
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Vorherigen Wert aus einer Tabelle bestimmen

  Alt 23. Nov 2018, 12:02
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.
Heiko
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Vorherigen Wert aus einer Tabelle bestimmen

  Alt 23. Nov 2018, 12:07
@uwe: Ist zwar im Beispiel zwar so, in der Praxis aber selten.

@Heiko: Ich dachte eine ID unabhängig von den Werten. Und First 1 bewirkt, dass nur ein datensatz über das Netz geht.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#6

AW: Vorherigen Wert aus einer Tabelle bestimmen

  Alt 23. Nov 2018, 12:29
@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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Vorherigen Wert aus einer Tabelle bestimmen

  Alt 23. Nov 2018, 17:44
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#8

AW: Vorherigen Wert aus einer Tabelle bestimmen

  Alt 23. Nov 2018, 22:37
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:11 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