"Lücke" finden

"Lücke" finden

am 31.07.2006 21:55:19 von Martin Schneider

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

Re: "Lücke"finden

am 31.07.2006 22:21:19 von Andreas Kretschmer

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)

Re: "Lücke" finden

am 31.07.2006 22:22:48 von Kai Ruhnau

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.

Re: "Lücke" finden

am 01.08.2006 07:20:48 von Martin Schneider

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

Re: "Lücke"finden

am 01.08.2006 08:24:28 von Thomas Rachel

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]

Re: "Lücke" finden

am 01.08.2006 09:36:51 von Frank Schenk

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

Re: "Lücke" finden

am 01.08.2006 10:22:18 von Martin Schneider

> 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

Re: "Lücke" finden

am 01.08.2006 10:53:58 von Martin Schneider

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

Re: "Lücke"finden

am 01.08.2006 11:15:00 von Andreas Kretschmer

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)

Re: "Lücke"finden

am 01.08.2006 18:01:23 von Niki Hansche

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 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