![]() |
Datenbank: ORACLE • Version: 10 • Zugriff über: BDE
Geschachtelte SQL-Abfrage
Hallo zusammen,
ich habe folgendes Problem: SPALTE1 SPALTE2 123456 1 123456 2 123456 3 123555 1 123555 3 Spalte1 ist eine Gerätenummer und Spalte 2 die Zeitscheibennummer. Ich möchte jetzt mit einer SQL-Abfrage herrausfinden, welche Gerätenummer KEINE vortlaufenden Zeitscheiben hat. Wie kann ich das realisieren ? Ergebnis oben müsste lauten: 123555 Wenn möglich noch die fehlende Zeitscheibe (Hier: 2) mit ausgeben MfG Holger |
AW: Geschachtelte SQL-Abfrage
Mach ein Join auf dieselbe Tabelle und als Verknüpfungsparameter nimmst Du die Gerätenummer und die Zeitscheibe -1 und fragst auf Existenz ab. So erhältst Du diejenigen VOR DENEN mindestens eine Lücke besteht. Ansonsten müsstest Du evtl. ein Script schreiben.
|
AW: Geschachtelte SQL-Abfrage
Nehmen wir mal an, die Tabelle erlaubt pro Gerät keine doppelten Zeitscheibennummern, dann lass doch einfach nach der Gerätenummer gruppieren und vergleiche das Maximum-Minimum von der Zeitscheibennummer (+1) mit der Anzahl der Datensätze
|
AW: Geschachtelte SQL-Abfrage
Hilft dir dabei nicht der "kleine Gauß" vielleicht weiter?
![]() Unter der Annahme, dass die Zeitscheibenwerte immer bei 1 beginnen, könnte doch folgendes klappen?
Code:
Ist jetzt keine 1A-SQL-Syntax, sollte aber das Prinzip verdeutlichen. Unter der weiteren Annahme, dass maximal ein Zeitscheibenwert fehlt, bekommst du denn noch durch
SELECT spalte1 FROM table WHERE (maximum(spalte2)*(maximum(spalte2)+1)/2) <> sum(spalte2)
Code:
geliefert.
(maximum(spalte2)*(maximum(spalte2)+1)/2) - sum(spalte2)
|
AW: Geschachtelte SQL-Abfrage
Hallo zusammen,
danke schon einmal für die Hinweise. Versuche gerade das auch schon in SQL umzusetzen. Stoße dabei aber auf Probleme. Könnt Ihr mir noch etwas SQL-Code liefern. Wäre super ? Wie ich die Formel nachti1505 in SQL umsetzen soll, weiß ich auch nicht ? Bitte noch um ein wenig Unterstützung. Gruss Holger |
AW: Geschachtelte SQL-Abfrage
Habe es jetzt doch hinbekommen. Musste HAVING benutzen.
Delphi-Quellcode:
Vielen dank an Euch alle.
SELECT GERAET, (MAX(ZEITSCHEIBE)*(MAX(ZEITSCHEIBE)+1)/2) - SUM(ZEITSCHEIBE) AS FEHLENDE_ZEITSCHEIBE
FROM SYSSIGMA.ZST_LAGER WHERE 1 = 1 HAVING (MAX(ZEITSCHEIBE)*(MAX(ZEITSCHEIBE)+1)/2) <> SUM(ZEITSCHEIBE) GROUP BY GERAET MfG holger |
AW: Geschachtelte SQL-Abfrage
Mit dieser Abfrage bekommst Du nur einen Eintrag pro Gerät. Ist das relevant?
Unter Oracle kannst Du mit
Code:
gezielt auf Vorgänger/Nachfolger Datensätze zugreifen.
Lag/Lead, OVER(ORDER BY ..)
|
AW: Geschachtelte SQL-Abfrage
Zitat:
Code:
und dasselbe für alle ohne Vorgänger, gleich mit rein verknüpft:
select t1.*, t2.zeitscheibe as z1
from #test t1 left outer join #test t2 on t1.nummer=t2.nummer and t1.zeitscheibe=t2.zeitscheibe-1 order by t1.nummer, t1.zeitscheibe
Code:
jetzt kann man an den fehlenden Inhalten der Spalten z1 und z2 erkennen, wer keinen Vorgänger bzw Nachfolger hat:
select t1.*, t2.zeitscheibe as z1, t3.zeitscheibe as z2
from #test t1 left outer join #test t2 on t1.nummer=t2.nummer and t1.zeitscheibe=t2.zeitscheibe-1 left outer join #test t3 on t1.nummer=t3.nummer and t1.zeitscheibe=t3.zeitscheibe+1 order by t1.nummer, t1.zeitscheibe
Code:
welche Zeitscheibe fehlt, ist dann nur noch Mengenlehre;)
select t1.*, t2.zeitscheibe as z1, t3.zeitscheibe as z2
from #test t1 left outer join #test t2 on t1.nummer=t2.nummer and t1.zeitscheibe=t2.zeitscheibe-1 left outer join #test t3 on t1.nummer=t3.nummer and t1.zeitscheibe=t3.zeitscheibe+1 where (t2.zeitscheibe is null) and (t3.zeitscheibe is null) order by t1.nummer, t1.zeitscheibe |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz