AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken SQL - Abfrage nach verschachtelten Kriterien
Thema durchsuchen
Ansicht
Themen-Optionen

SQL - Abfrage nach verschachtelten Kriterien

Ein Thema von DeddyH · begonnen am 20. Okt 2016 · letzter Beitrag vom 21. Okt 2016
Antwort Antwort
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#1

SQL - Abfrage nach verschachtelten Kriterien

  Alt 20. Okt 2016, 18:05
Datenbank: MSSQL • Version: 2012 oder höher • Zugriff über: SQL
Ich beiße mir gerade die 3. Zähne an einer Abfrage aus. Gegeben sei folgende Tabellenstruktur:
FeldTypNULL
IDINTNOT NULL
BenutzerIDINTNOT NULL
StatusINTNOT NULL
AnfangDateTimeNOT NULL
EndeDateTimeNULL
SerieINTNULL
Daraus muss ich nun maximal 1 Datensatz je BenutzerID ermitteln, und zwar nach folgender Wichtung:
- Existiert ein Datensatz mit einem NULL-Ende, dann den
- Existiert ein Datensatz, der Teil einer Serie ist (Feld Serie ist also nicht NULL), dann soll geprüft werden, ob sich der minimale Anfang in der Vergangenheit und das maximale Ende der gesamten Serie (also aller Datensätze mit demselben Wert im Feld Serie) in der Zukunft befinden, der jetzige Zeitpunkt also innerhalb des Gesamtzeitraums liegt. Bei einem Treffer sollen im Ergebnis dann Minimalanfang und Maximalende samt Status (der Status innerhalb einer Serie ist immer derselbe) zurückgegeben werden.
- Existieren mehrere solcher Serien, dann soll die Serie mit dem kleinsten in der Zukunft liegenden Maximalende genommen werden.

Ich denke, dass das mit verschachtelten Subqueries zu machen sein müsste, bekomme aber auch nach Stunden nicht das richtige Ergebnis. Entweder ist das wirklich so kompliziert, oder ich habe mich auf einem Irrweg festgerannt und finde da nicht wieder runter.

Hat jemand eine Idee, wie man das umsetzen könnte?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (20. Okt 2016 um 18:19 Uhr) Grund: Hervorhebung
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#2

AW: SQL - Abfrage nach verschachtelten Kriterien

  Alt 20. Okt 2016, 20:51
Deien Text 1:1 in Code übersetzt. (nur das sas SELECT vorm WHERE steht, was im Text andersrum war )
SQL-Code:
SELECT Serien.*,
  (SELECT Min(x.Anfang) FROM Serien AS x WHERE x.Serie = Serien.Serie) AS MinAnfang,
  (SELECT Max(x.Ende) FROM Serien AS x WHERE x.Serie = Serien.Serie) AS MaxEnde
FROM Serien
WHERE Ende IS NULL
  OR (Serie IS NOT NULL
    AND (SELECT Min(x.Anfang) FROM Serien AS x WHERE x.Serie = Serien.Serie) < NOW
    AND (SELECT Max(x.Ende) FROM Serien AS x WHERE x.Serie = Serien.Serie) > NOW)
ORDER BY MaxAnfang
Und jetzt mußt du nur noch die beiden SubSelects in je einen LEFT JOIN auslagern
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (20. Okt 2016 um 21:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

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

AW: SQL - Abfrage nach verschachtelten Kriterien

  Alt 20. Okt 2016, 23:34
Daraus muss ich nun maximal 1 Datensatz je BenutzerID ermitteln, und zwar nach folgender Wichtung:
- Existiert ein Datensatz mit einem NULL-Ende, dann den
Was ist, wenn es mehrere solche Sätze pro BenutzerID gibt?
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
 
#4

AW: SQL - Abfrage nach verschachtelten Kriterien

  Alt 21. Okt 2016, 06:56
Das klingt für mich so als würde Sortieren reichen, und dann jeweils den ersten Datensatz pro userid nehmen?
Einziges Kriterium wäre dann, daß Anfang in der Vergangenheit liegt?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (21. Okt 2016 um 06:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: SQL - Abfrage nach verschachtelten Kriterien

  Alt 21. Okt 2016, 07:12
Danke für die Antworten, der Ansatz mit den OUTER JOINS hat mir gefehlt, ich denke, damit bekomme ich mein Wunschergebnis hin
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  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 01:10 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