# Kleinstes Datum herausfinden



## Communicate (17. August 2009)

Oracle
Hallo zsuammen, 

ich verzweifle gerade an folgendem problem:

Ich habe eine historisierungstabelle. In dieser gibt es eine spalte "history.col_value_new". 
Jedesmal, wenn die zugehörige original Spalte verändert wird, wird auch die history.col_value_new automatisch verändert. 

Nun geht es mir darum, den aktuellesten Wert herauszufinden. 
Ich dachte mir das eigentlich ganz einfach mit min(history.col_value_new) soltle das zu machen sein, ist es aber nicht, weil ich immer alle werte von history.col_value_new erhalten. Hier mal mein ganzer Code:


```
SELECT history.table_name,   
         history.col_name,   
history.col_value_new, 
         kunden.kunden_id,   
         kunden_ext.kunden_id  
    FROM history,   
         kunden,   
         kunden_ext  
   WHERE ( kunden.kunden_id = kunden_ext.kunden_id ) and  
         ( ( history.table_name = 'KUNDEN_EXT' ) AND  
         ( history.pk_value = '(' || kunden.KUNDEN_ID || ')' ) ) AND  
         history.col_name = 'LETZTE_BEWEGUNG' AND  
         to_date(sysdate)- to_date(history.col_value_new) > 120    
Group by history.table_name,   
         history.col_name,   
         history.col_value_new,
         kunden.kunden_id,   
         kunden_ext.kunden_id
HAVING to_date(history.col_value_new) =min(to_date((history.col_value_new)));
```

Kann mir einer von Euch helfen, was ich falsch mache?

Grüße
Communicate


----------



## wod2008 (17. August 2009)

hmm  ORDER BY `date` LIMIT 1
Oder was meinst du?


----------



## Communicate (17. August 2009)

das bringt leider nur ein ora-00933: SQL BEfehl wurde nicht korrekt beendet.

Nochmal zru verdeutlichung: 

Es gibt eine Tabelle Kunden. In dieser gibt es die Spalte "LETZTE_BEWEGUNG".
In der Spalte steht z.B. "01.01.2000". Nun wird das Datum verändert und LETZE_BEWEGUNG ist nun 10.10.2009. gleichzeitig wird in der historisierungstabelle die spalte history.col_name mit "Letzte_BEWEGUNG" gefüllt und der neue Wert in history.col_value_new geschrieben. Der alte Wert von history.col_value_new ist also 01.01.2000 und der neue 10.10.2009. Ich möchte nur den Datensatz als Ausgabe, wo 10.10.2009 steht.

Ich hoffe ich habe mich ejtzt etwas besser ausgedrückt....


----------



## Communicate (17. August 2009)

Okay, einen Schritt nach vorn, drei zurück....

Ich denke, ich werde um subquerys nicht herumkommen (in oracle gibts kein limit)...

Aber von Subquerys habe ich so überhaupt keien Ahnung, kann mir noch jemand helfen?


----------



## kuddeldaddeldu (17. August 2009)

Hi,



Communicate hat gesagt.:


> das bringt leider nur ein *ora-00933*: SQL BEfehl wurde nicht korrekt beendet.



Bitte gib im Datenbankforum immer das  DBMS im Titel an. Sonst rät man hier wild herum. Danke.

LG


----------



## dbwizard (17. August 2009)

Communicate hat gesagt.:


> Okay, einen Schritt nach vorn, drei zurück....
> 
> Ich denke, ich werde um subquerys nicht herumkommen (in oracle gibts kein limit)...
> 
> Aber von Subquerys habe ich so überhaupt keien Ahnung, kann mir noch jemand helfen?



hallo,

etwa so :


```
....
....

WHERE myDatumsFeld = (select max(myDatumsFeld) from mytable);
....
```

Gruss


----------



## dbwizard (17. August 2009)

kuddeldaddeldu hat gesagt.:


> Hi,
> 
> 
> 
> ...



..hat er ja, allerdings eher unauffällig und auch nicht im Titel und nicht wirklich spezifisch....




Gruss


----------



## Communicate (17. August 2009)

Okay, okay, nächstes mal schreib ichs deutlich oben drüber 

Ich hab das ganze gerade mal ausprobiert. leider funktioniert es nicht. Ich weiss schon warum ich diese subqueries hasse :-( 

Mein Code sieht jetzt folgender maßen aus und bricht in der letzten Zeile mit ora00936 - Ausdruck fehlt ab:


```
SELECT history.table_name,   
         history.col_name,   
history.col_value_new, 
         kunden.kunden_id,   
         kunden_ext.kunden_id  
    FROM history,   
         kunden,   
         kunden_ext  
   WHERE ( kunden.kunden_id = kunden_ext.kunden_id ) and  
         ( ( history.table_name = 'KUNDEN_EXT' ) AND  
         ( history.pk_value = '(' || kunden.KUNDEN_ID || ')' ) ) AND  
         history.col_name = 'LETZTE_BEWEGUNG' AND  
         to_date(sysdate)- to_date(history.col_value_new) > 120 And 
history.col_value_new = select max(history.col_value_new) from history;
```


----------



## dbwizard (17. August 2009)

Communicate hat gesagt.:


> Okay, okay, nächstes mal schreib ichs deutlich oben drüber
> 
> Ich hab das ganze gerade mal ausprobiert. leider funktioniert es nicht. Ich weiss schon warum ich diese subqueries hasse :-(
> 
> ...



Hallo,


Die Klammern sind aber wichtig und nicht freiwillig ...deswegen ora00936 - Ausdruck fehlt ...


```
history.col_value_new = (select max(history.col_value_new) from history);
```


Gruss


----------



## Communicate (17. August 2009)

na da muss man erstmal drauf kommen ;-)

So, jetzt gibts zwar keinen Fehler mehr, aber auch keine Werte. Sprich mein Ergebnis ist immer blank :-(

Woran könnte das denn jtzt noch liegen


----------



## dbwizard (17. August 2009)

Communicate hat gesagt.:


> na da muss man erstmal drauf kommen ;-)
> 
> So, jetzt gibts zwar keinen Fehler mehr, aber auch keine Werte. Sprich mein Ergebnis ist immer blank :-(
> 
> Woran könnte das denn jtzt noch liegen



...nun....mit diesen Bedinungen gibt es keine Datensätze, welche die Bedinung erfüllen ? Ohne deine Daten zu sehen, ist dies unmöglich zu beurteilen.

Lass die Query laufen mit den where - Bedinungen auskommentiert und füge eine nach der anderen wieder zu, dann siehst du, wo die Einschränkung liegt

Gruss


----------



## Communicate (17. August 2009)

hmmm... das merkwürdige ist, dass ich ohne die neuel Where Bedingung
(history.col_value_new = select max(history.col_value_new) from history jede Menge ergebnisse erhalte. Sobald ich die Where bedingung aber hinzufüge, gibt es null "treffer". 
Was ja eigentlich total unlogisch ist, da col_value_new ja bereits im resultset vorhanden ist... !


----------



## dbwizard (17. August 2009)

Communicate hat gesagt.:


> hmmm... das merkwürdige ist, dass ich ohne die neuel Where Bedingung
> (history.col_value_new = select max(history.col_value_new) from history jede Menge ergebnisse erhalte. Sobald ich die Where bedingung aber hinzufüge, gibt es null "treffer".
> Was ja eigentlich total unlogisch ist, da col_value_new ja bereits im resultset vorhanden ist... !



- Format des Datums? Führe einfach mal select max(history.col_value_new) from history; aus. Das muss 1 Row ergeben. Gibt es diesen Wert so in der Tabelle?


Gruss


----------



## Communicate (17. August 2009)

okay, das ergiebt genau 1 treffer.

Ich abe die Where Bedingung nocheinmal etwas umgestrickt:


```
history.col_value_new = (select min((history.col_value_new)) from history where( history.table_name = 'KUNDEN_EXT' ) and  history.col_name='LETZTE_BEWEGUNG') )
```

Das bringt mir jetzt auch genau einen Treffer.

Ich möchte nun aber ja für jeden Kunden das kleinste Datum ausgegeben bekommen. So wie es im moment ist, erhalte ich nur das kleinste Datum von allen, also genau 1 Kunde.
Ich möchte ja aber gerne für jeden Kunden das älteste Datum. Sprich für jeden history.pk_value möchte ich das kleinste history.col_value_new.

Irgendwie bin ich mittlerweile total verwirrt .... 
ich hoffe Du ahst noch Geduld mit mir


----------



## dbwizard (17. August 2009)

Communicate hat gesagt.:


> okay, das ergiebt genau 1 treffer.
> 
> Ich abe die Where Bedingung nocheinmal etwas umgestrickt:
> 
> ...




Hi, 

Dazu musst du nach Kunden_id gruppieren und das MAX als Aggregat im Select aufnehmen (Da benötigst du keine Subquery)


```
select kunden_id, max(col_value_new) from .....
....
Group by kunden_id
```



- Die weiteren Felder musst du dir noch zu-Joinen

(Übrigens : Willst du das älteste (=min) oder jüngste Datum (=max) haben ?)

Gruss


----------



## Communicate (18. August 2009)

Guten morgen,

ich ahbs ausprobiert, wie du gesagt hast:

hier jetzt mein aktueller (verschlankter Code):


```
SELECT max( history.col_value_new),   
         history.pk_value,   
         max(history.col_value_new)
    FROM history  
   WHERE ( history.table_name = 'KUNDEN_EXT'  ) AND  
         ( history.col_name = 'LETZTE_BEWEGUNG' )   
GROUP BY history.col_value_new,   
         history.pk_value
```

Aber ich erhalte nicht nur den aktuellsten Wert, sondern auch noch alle älteren... 

Ich bin so langsam aber sicher total verzweifelt


----------



## vfl_freak (18. August 2009)

Moin,

hat es irgendeinen bestimmten Grund, dass Du den Wert zweimal selektierst ? 



> SELECT max( history.col_value_new),  // <=== ! ! !
> history.pk_value,
> max(history.col_value_new)   // <=== ! ! !
> FROM history
> ...



Gruß
Klaus


----------



## Communicate (18. August 2009)

tipp fehler 

Aber auch mit nur einem select klappts leider nciht ;-(


----------

