Fehlende Zahlenlücken ausgeben

winscheil

Aktiver Benutzer
Beiträge
25
Hallo,

ich habe folgendes Problem.
Ich habe eine Tabelle mit Werten, Kalenderwochen und Jahren.
Bsp:
Kalenderwoche Jahr Wert
17 2021 ABC
18 2021 XYZ
20 2021 KML
21 2021 DEF
24 2021 GHI

Ich bräuchte in dem Fall eine Ausgabe mit den fehlenden Kalenderwochen von der kleinsten Kalenderwoche bis zur größten Kalenderwoche.

Also so:
19
22
23


Kann mir da jemand helfen, wie diese Abfrage im SQL umsetzbar ist?
 
Werbung:
SQL arbeitet Mengen basiert und vergleicht diese. Daten die man nicht hat, kann man nicht vergleichen.
Alle Datenlücken in SQL werden gleich behandelt. Man findet sie, indem man sie mit Sollwerten vergleicht.
Wenn es hier um KW geht, könnte man also eine Tabelle mit den Zahlen von 1 bis 52 hernehmen und sie mit den fraglichen Daten vergleichen.
Wenn man das geschafft hat, kann man generalisieren und versuchen, die ansonsten unnütze Tabelle mit den Zahlen zu vermeiden. Dies erfolgt idR, in dem entsprechende Werte nach Bedarf, on-the-fly, generiert werden.
 
mit PostgreSQL ginge es so:

Code:
edb=*# select * from winscheil ;
 zahl
------
   17
   18
   20
   21
   24
(5 rows)

edb=*# with x as (select min(zahl) m, max(zahl) x from winscheil),g as (select generate_series(x.m, x.x) g from x) select g from g left join winscheil w on g.g = w.zahl where w.zahl is null;
 g  
----
 19
 22
 23
(3 rows)

edb=*#
 
Das grundsätzliche Problem an Deiner Frage ist, wie Du definierst, was fehlt. Je nachdem welcher Datentyp das ist (INT, BIGINT) können das prinzipiell alle Zahlen des validen Zahlenbereiches sein. Dazu kommt: kann und darf es Mehrfachvorkommen geben? Da kommt man schnell an einen Punkt, wo die Ergebnissmenge, nun ja, unübersichtlich wird ...
 
OK
Wenn ich jetzt eine weitere Tabelle mit allen KWs habe und diese beiden dann joine:

select distinct t1.KALENDERWOCHE, t2.KALENDERWOCHE
from TABELLE_ALLE_KWS t1
left join TABELLE_FEHLENDE_KWS t2 on t1.KALENDERWOCHE = t2. KALENDERWOCHE

erhalte ich folgendes Ergebnis:
...
25 NULL
26 NULL
27 27
28 NULL
29 29
30 NULL
31 NULL
32 32
33 NULL
34 34
35 NULL
36 NULL

wie muss ich die Abfrage stellen, damit ich nur die 28, 30, 31, 33 erhalte?
 
Werbung:
Zurück
Oben