"Lücke" finden

8 views
Skip to first unread message

Martin Schneider

unread,
Jul 31, 2006, 3:55:19 PM7/31/06
to
Hallo!

Stehe gerade etwas auf dem Schlauch: Ich habe einen Zähler 1,2,3,4,5,6,
in dem Lücken vorkommen können (1,2,4,5,6). Wie finde ich die Lücke (3)
mit einer SQL-Abfrage?

Viele Grüße

Martin

Andreas Kretschmer

unread,
Jul 31, 2006, 4:21:19 PM7/31/06
to
begin Martin Schneider <can...@yahoo.de> wrote:
> Hallo!

> Stehe gerade etwas auf dem Schlauch: Ich habe einen Zähler 1,2,3,4,5,6,
> in dem Lücken vorkommen können (1,2,4,5,6). Wie finde ich die Lücke (3)
> mit einer SQL-Abfrage?

Für Dein Beispiel:

test=# select * from zaehler ;
z
---
1
2
4
5
6
(5 rows)

test=# select * from generate_series(1,6) s(i) where i not in (select * from zaehler );
i
---
3
(1 row)


Okay, generate_series() kennt Dein System nicht, sollte sich aber
basteln lassen. Die Parameter sind hier min() und max() Deines Zählers.


end
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Kai Ruhnau

unread,
Jul 31, 2006, 4:22:48 PM7/31/06
to
Martin Schneider wrote:
> Stehe gerade etwas auf dem Schlauch: Ich habe einen Zähler 1,2,3,4,5,6,
> in dem Lücken vorkommen können (1,2,4,5,6). Wie finde ich die Lücke (3)
> mit einer SQL-Abfrage?

Wenn dir egal ist, wie groß die Lücke ist, dann hol dir alle Zähler, die
die keinen direkten Vorgänger haben (self join). Vor diesem Zähler ist
dann eine Lücke (oder der Zähler ist 1).

Wenn du dagegen alle fehlenden Zähler suchst, dann wird's komplizierter.

Grüße
Kai

--
This signature is left as an exercise for the reader.

Martin Schneider

unread,
Aug 1, 2006, 1:20:48 AM8/1/06
to
Danke für die Antworten!

Kai Ruhnau schrieb:


> Martin Schneider wrote:
>> Stehe gerade etwas auf dem Schlauch: Ich habe einen Zähler
>> 1,2,3,4,5,6, in dem Lücken vorkommen können (1,2,4,5,6). Wie finde ich
>> die Lücke (3) mit einer SQL-Abfrage?
>
> Wenn dir egal ist, wie groß die Lücke ist, dann hol dir alle Zähler, die
> die keinen direkten Vorgänger haben (self join). Vor diesem Zähler ist
> dann eine Lücke (oder der Zähler ist 1).
>
> Wenn du dagegen alle fehlenden Zähler suchst, dann wird's komplizierter.

Ich habs mal so versucht:
select min(a1.zaehler+1) from table_a AS a1
LEFT JOIN table_a AS a2
ON a1.zaehler = a2.zaehler-1
WHERE
a2.id IS NULL;

Das geht soweit, findet aber nicht, wenn die Lücke am Anfang ist
(2,3,4,5,6...) -> 7 statt 1.

Viele Grüße

Martin

Thomas Rachel

unread,
Aug 1, 2006, 2:24:28 AM8/1/06
to
Martin Schneider wrote:

> Ich habs mal so versucht:
> select min(a1.zaehler+1) from table_a AS a1
> LEFT JOIN table_a AS a2
> ON a1.zaehler = a2.zaehler-1
> WHERE
> a2.id IS NULL;
>
> Das geht soweit, findet aber nicht, wenn die Lücke am Anfang ist
> (2,3,4,5,6...) -> 7 statt 1.

Ist doch schon mal gut. Da hast Du dann eben die beiden Tabelle
vertauscht - oder wahlweise die Vorzeichen.

Was Du findest, ist der fehlende Nachfolger aller Werte, die keinen
Nachfolger in der Tabelle haben.

Was Du hingegen suchst, ist der fehlende Vorgänger aller Werte, die
keinen Vorgänger in der Tabelle haben.

Also select max(a1.zaehler-1) ... ON a1.zaehler = a2.zaehler+1.

Thomas
--
Die Verwendung von mehreren Ausrufezeichen macht die Aussage nicht
ausrufender sondern ausufernder. [Michael Bauer in dnq]

Frank Schenk

unread,
Aug 1, 2006, 3:36:51 AM8/1/06
to
Martin Schneider wrote:
> Hallo!
>
> Stehe gerade etwas auf dem Schlauch:

Dann tritt halt zur Seite :-)

> Ich habe einen Zähler 1,2,3,4,5,6,

auto_increment?

> in dem Lücken vorkommen können (1,2,4,5,6).

Ja, das soll so sein

> Wie finde ich die Lücke (3)

Wozu willst du die finden?

> mit einer SQL-Abfrage?

Falls wirklich auto_increment hak das Thema ganz schnell ab. Der
auto_increment ist nun mal so gebaut, daß Lücken drin sein können, MySQL
stört das nicht, wenn das deine Applikation stört ist sie kaputt.

Frank

Martin Schneider

unread,
Aug 1, 2006, 4:22:18 AM8/1/06
to
> Falls wirklich auto_increment hak das Thema ganz schnell ab. Der
> auto_increment ist nun mal so gebaut, daß Lücken drin sein können, MySQL
> stört das nicht, wenn das deine Applikation stört ist sie kaputt.
Danke für Deine Sorge, aber es geht nicht um Autoinkrement. Es geht um
eine Art - wieschreibichsambesten - "Schubladensystem", bei dem die
Schubladen mit Nummern versehen sind und von unten her "aufgefüllt" werden.

Viele Grüße

Martin

Martin Schneider

unread,
Aug 1, 2006, 4:53:58 AM8/1/06
to
Hallo Andreas, danke für Deine Antwort.

> test=# select * from generate_series(1,6) s(i) where i not in (select * from zaehler );
> i
> ---
> 3
> (1 row)
>
>
> Okay, generate_series() kennt Dein System nicht, sollte sich aber
> basteln lassen. Die Parameter sind hier min() und max() Deines Zählers.

Okay, aber ich kenne max() meines Zählers nicht. Ich könnte natürlich
vorher max bestimmen, aber ich suche ja alles in EINER SQL-Abfrage.

Viele Grüße

Martin

Andreas Kretschmer

unread,
Aug 1, 2006, 5:15:00 AM8/1/06
to
begin Martin Schneider <can...@yahoo.de> wrote:

select g.num from
generate_series ((SELECT min(z) FROM zaehler),
(SELECT max(z) FROM zaehler)) AS g(num)
LEFT JOIN zaehler ON zaehler.z = g.num
WHERE zaehler.z IS NULL;


> Viele Grüße

Ditto.

Niki Hansche

unread,
Aug 1, 2006, 12:01:23 PM8/1/06
to
Moiners Martin,

Martin Schneider wrote:

> Hallo!
>
> Stehe gerade etwas auf dem Schlauch: Ich habe einen Zähler 1,2,3,4,5,6,

Groupieren! Das ist eine Standardaufgabe.

sqlite> select * from a;
1
2
4
5
8
9
11
sqlite> select a.a,min(b.a) from a a join a b on a.a<b.a group by a.a having
min(b.a)-a.a>1;
2|4
5|8
9|11
sqlite>

Den Rest lasse ich jetzt mal als Hausaufgabe übrig.

Viel Spaß noch

Niki

Reply all
Reply to author
Forward
0 new messages