# Eine Tabelle Jede Zeile vergleichen



## TutorialKing (5. September 2008)

Hallo zusammen,

ich habe eine knackige Aufgabe bekommen und weiß leider nicht ob das überhaupt mit reinem SQL zu lösen ist.

Ich habe eine Tabelle mit x Spalten, davon sind 3 relevant. Nennen wir sie :
bezeichnung (Nummer)
groesse  (Nummer)
Datum

Alle Felder liegen leider in varchar2 vor :-(
Beispieldatensätze:
Muss angezeigt werden...
bezeichnung	groesse		Datum
XDC566		12000		09.10.2007
XDC566		12000		09.10.2007
XDC566		12000		09.10.2007
XDC566		15000		09.12.2007
XDC566		15000		09.12.2007
XDC566		10000		09.05.2008
Datensätz ok nicht anzeigen...
XP2P11		45000		01.01.2008
XP2P11		45000		01.01.2008
XP2P11		45000		01.01.2008
XP2P11		45000		01.01.2008
XP2P11		46000		09.02.2008
XP2P11		50000		10.05.2008

Erklärung :
Zu der Bezeichnung gibt es eine Größe und ein Datum, wenn diese identisch sind ist alles ok. Wenn die Größe 12000 am 09.10.2007 beträgt dann muss der nachfolgende Datensatz entweder identisch sein oder Größe und Datum ändern. Also in unserem Falle Größe:15000 und Datum 09.12.2007. Es darf aber nicht sein das am 09.05.2008 die Größe auf 10000 fällt.Falls dies der Fall ist bitte alle Datensätze zu XDC566 anzeigen order by datum.


----------



## dbwizard (5. September 2008)

TutorialKing hat gesagt.:


> Hallo zusammen,
> 
> ich habe eine knackige Aufgabe bekommen und weiß leider nicht ob das überhaupt mit reinem SQL zu lösen ist.



- Ich tippe auf Oracle ? Wäre gut zu wissen, auch die Version etc


Gruss


----------



## TutorialKing (5. September 2008)

> - Ich tippe auf Oracle ? Wäre gut zu wissen, auch die Version etc



Wozu? Reines SQL ist überall gleich.
Es ist Oracle 10


----------



## dbwizard (5. September 2008)

TutorialKing hat gesagt.:


> Wozu? Reines SQL ist überall gleich.



- Tatsächlich ? und es hat sich seit 40 Jahren nicht entwickelt ?


----------



## TutorialKing (6. September 2008)

Ich würde hier gerne produktive Antworten hören. Hat sonst niemand eine Idee wie man das Problem effektiv lösen kann ?


----------



## ZodiacXP (6. September 2008)

Ich habs mir schon zwei, drei mal hier angeguckt aber dein Beispiel und die Aufgabenstellung verstehe ich nicht. Vielleicht gehts da anderen auch so.

Warum darf sich die Menge vom 09.12.07 zum 09.05.08 nicht ändern aber vom 09.10.07 zum 09.12.07 schon?

Eine strukturierte Erklärung wäre gut.


----------



## TutorialKing (7. September 2008)

Ich versuche es nochmal einfach zu erklären :

Die "Groesse" muss sich mit der Zeit "Datum" erhöhen oder zumindest gleich bleiben. Sie darf aber nicht kleiner werden.
Die Zeit verändert sich ja nur in eine Richtung 2008,2009,2010 etc. die Groesse muss hier mit wachsen bzw. gleich bleiben.

Falls am 01.01.2007 die Groesse "1000" beträgt dann müssen bei weiteren Datensätze die Groesse auf "1000" bleiben oder sich erhöhen. Falls nun irgendwann in der Zukunft die "Groesse" kleiner wird sollen diese Datensätze angezeigt werden.


----------



## ZodiacXP (7. September 2008)

Achso. Dafür musste bisschen um die Ecke denken.
Einige Subquerys machen und etwas davon einfließen lassen:
http://dev.mysql.com/doc/refman/5.1/de/control-flow-functions.html

Grob würde ich sagen:

```
SELECT * FROM tabelle WHERE bezeichnung = (SELECT CASE .....
```

Mit einem SQL-Export deiner Tabelle könnte ich sogar testen welcher Query dazu passt, da er mir doch sehr komplex erscheint.


----------



## Cojote (8. September 2008)

Wenn ichs richtig verstanden habe:

SELECT * FROM tabelle WHERE bezeichnung IN (SELECT bezeichnung from tabelle t, tabelle t2 WHERE t.bezeichung=t2.bezeichnung AND t.groesse>t2.groesse AND t.datum<t2.datum)
ORDER BY bezeichnung, datum ASC;

Hab leider keine Oracle zum testen, daher weiß ich nicht ob sie das frisst. Aber Grundidee sollte klar werden.


----------



## TutorialKing (8. September 2008)

@Cojote
Ich habe den Befehl nun von dir übernommen, leider bekomme ich folgende Fehlermeldung : ORA-00918 column ambiguously defined. Ich vermute das man von der gleichen Tabelle nicht 2 unterschiedliche Aliases nehmen kann.


@ZodiacXP
Leider nutze ich kein Mysql sondern Oracle und kann somit keine Mysql Funktionen nutzen.
Auch kann ich keine Dateien hier anhängen sonst hätte ich dir einen kleinen Export zeigen können


----------



## ZodiacXP (8. September 2008)

Achso ok.



TutorialKing hat gesagt.:


> ORA-00918 column ambiguously defined


Da meckert er vielleicht weil bezeichnung kein Alias davor hat im SubQuery:

[...] IN (SELECT *t.*bezeichnung from [...]


----------



## TutorialKing (8. September 2008)

> Da meckert er vielleicht weil bezeichnung kein Alias davor hat im SubQuery:
> 
> [...] IN (SELECT t.bezeichnung from [...]



Stimmt ! Habe ich leider übersehen. Abfrage läuft jetzt, leider kommt nicht das gewünschte Ergebnis. Es werden "falsche" und "richtige" Datensätze angezeigt.

Beispiel :
bezeichnung	groesse		datum

ABB12345		55000		11.06.2007
ABB12345		55000		11.06.2007
ABB12345		22000		26.07.2006
ABB12345		22000		26.07.2006
ABB12345		22000		26.07.2006

ZGF93764		51000		08.05.2007
ZGF93764		51000		08.05.2007
ZGF93764		51000		08.05.2007
ZGF93764		51000		08.05.2007
ZGF93764		51000		08.05.2007
ZGF93764		51000		08.05.2007
ZGF93764		51000		08.05.2007
ZGF93764		71000		11.08.2006
ZGF93764		71000		11.08.2006
ZGF93764		71000		11.08.2006
ZGF93764		71000		11.08.2006
ZGF93764		71000		11.08.2006
ZGF93764		71000		11.08.2006
ZGF93764		66000		13.07.2006
ZGF93764		66000		13.07.2006
ZGF93764		66000		13.07.2006
ZGF93764		66000		13.07.2006

Die ersten Datensätze hätten nicht angezeigt werden sollen. Der nächste Abschnitt  ist korrekt, werde noch nach groesse sortieren für die bessere Übersichtlichkeit.


----------

