Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Geschachtelte SQL-Abfrage (https://www.delphipraxis.net/175688-geschachtelte-sql-abfrage.html)

HolgerCW 10. Jul 2013 07:03

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

Union 10. Jul 2013 07:14

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.

Sir Rufo 10. Jul 2013 07:15

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

nachti1505 10. Jul 2013 07:19

AW: Geschachtelte SQL-Abfrage
 
Hilft dir dabei nicht der "kleine Gauß" vielleicht weiter? http://de.wikipedia.org/wiki/Gau%C3%9Fsche_Summenformel


Unter der Annahme, dass die Zeitscheibenwerte immer bei 1 beginnen, könnte doch folgendes klappen?

Code:
SELECT spalte1 FROM table WHERE (maximum(spalte2)*(maximum(spalte2)+1)/2) <> sum(spalte2)
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

Code:
(maximum(spalte2)*(maximum(spalte2)+1)/2) - sum(spalte2)
geliefert.

HolgerCW 10. Jul 2013 07:45

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

HolgerCW 10. Jul 2013 07:50

AW: Geschachtelte SQL-Abfrage
 
Habe es jetzt doch hinbekommen. Musste HAVING benutzen.

Delphi-Quellcode:
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
Vielen dank an Euch alle.

MfG

holger

jobo 10. Jul 2013 08:32

AW: Geschachtelte SQL-Abfrage
 
Mit dieser Abfrage bekommst Du nur einen Eintrag pro Gerät. Ist das relevant?
Unter Oracle kannst Du mit
Code:
Lag/Lead, OVER(ORDER BY ..)
gezielt auf Vorgänger/Nachfolger Datensätze zugreifen.

joachimd 10. Jul 2013 08:38

AW: Geschachtelte SQL-Abfrage
 
Zitat:

Zitat von HolgerCW (Beitrag 1221311)
Ich möchte jetzt mit einer SQL-Abfrage herrausfinden, welche Gerätenummer KEINE vortlaufenden Zeitscheiben hat.

fangen wir mal an, alle ohne Nachfolger zu suchen
Code:
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
und dasselbe für alle ohne Vorgänger, gleich mit rein verknüpft:
Code:
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
jetzt kann man an den fehlenden Inhalten der Spalten z1 und z2 erkennen, wer keinen Vorgänger bzw Nachfolger hat:
Code:
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
welche Zeitscheibe fehlt, ist dann nur noch Mengenlehre;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:40 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