History-Tabelle abfragen

Hallo Forum,
ich stehe gerade tierisch auf´m Schlauch. Ich habe eine Tabelle mit den Feldern date und namen, namen kommen dabei extrem oft vor. Jetzt hätte ich gerne zu jedem Namen, das letzte Datum. Es handelt sich dabei um eine History-Tabelle und irgendwie bekomme ich meine Abfragen nicht zum richtigen Ergebnis genötigt.
mit besten Grüßen
Nick

sowas wie

select namen, min(datum) from tabelle group by namen

hast bisher noch nicht in Erwägung gezogen, oder?

Nein, das habe ich tatsächlich noch nicht in Betracht gezogen, besten Dank. Wenn du mir jetzt jedoch noch sagst wie ich es schaffe die Ausgabe um weitere Spalten zu erweitern, die beim Min-Datum gültigen waren-dann ist es perfekt.
mfg
Nick

wie wäre es mit nennen der Spalten im SELECT und im GROUP BY - Teil?

HI, sobald ich beides um eine Position erweitere erhöhen sich die Ergebnisse, ich möchte aber nur die haben, die auch bei dem “aktuellesten” Datum dabei sind.

Das ist das Wesen von GROUP BY. Vermutlich willst Du nun erst einmal nur mit den anfangs genannten Spalten arbeiten und dann die Ursprungstabelle mit dieser auf diesen Feldern joinen.

select * from foo left join (select col1, min(col2) as col2 from foo group by col1) bla on ((foo.col1, foo.col2)=(bla.col1, bla.col2))


So in der Art halt…

select * 
from ( 
    select tabelle.*,
           rank() over (partition by name order by datum desc) as rnk
  from tabelle 
) t
where rnk = 1;

Ja, mit CTE geht es eleganter. Manchmal hab auch ich zu viele Bäume in der Sicht …

Um pedantisch zu sein: das ist kein CTE.
Nur eine derived table mit einer window function :wink:

Ja, hast Recht :wink:

Hi, also selbst wenn ich diese Funktion verwende:

select * 
from ( 
    select history.*,
           rank() over (partition by name order by max(to_date(historydate,'YYYY-MM-DD')) desc) as rnk
  from  history 
) t
where rnk = 1;

erhalte ich ebenfalls den Fehler
FEHLER: Spalte „history.id“ muss in der GROUP-BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden

mit besten Grüßen
Nick

Ja, welcher Teil der Fehlermeldung ist jetzt nicht klar?

Vermeide select *, insbesondere in produktivem Code, und auch und insbesondere in Abfragen mit Aggregationen.

Schau Dir mein Beispiel nochmal genau an. Da habe ich kein max() verwendet.

Dein code

rank() over (partition by name order by max(to_date(historydate,'YYYY-MM-DD')) desc) as rnk

mein Code:

rank() over (partition by name order by datum desc) as rnk

Es macht auch nicht wirklich Sinn to_date() auf eine Spalte vom Datentyp DATE anzuwenden. Denn to_date() verwandelt einen String in ein DATE…

Einen wunderschönen guten morgen und besten Dank für eure Hilfen. Leider gelingt es mir immer noch nicht so wie ich es mir vorstelle. Hier jetzt einmal mein aktueller Code (ich lese mich gerade in das partition ein):

select * 
from ( 
    select history.date,history.uuid,history.name,
           rank() over (partition by uuid order by to_date(date,'YYYY-MM-DD') desc) as rnk
  from  history 
) t
where rnk = 1;

Ich bekomme jetzt immer noch zuviele Ausgaben unter anderem hier ein Auszug:

"2013-10-21T14:49:11";"899fa77a-4b11-4535-a40c-46ab7e24a265";"K. Meier"
"2013-10-21T11:07:41";"899fa77a-4b11-4535-a40c-46ab7e24a265";"K. Meier"
"2013-10-21T14:51:57";"899fa77a-4b11-4535-a40c-46ab7e24a265";"K. Meier"
"2013-10-21T15:02:18";"899fa77a-4b11-4535-a40c-46ab7e24a265";"K. Meier"
"2013-10-21T14:51:27";"899fa77a-4b11-4535-a40c-46ab7e24a265";"K. Meier"

Es sollte aber eigentlich nur dieser Tupel ausgegeben werden:

“2013-10-21T14:51:57”;“899fa77a-4b11-4535-a40c-46ab7e24a265”;“K. Meier” (der Eintrag Nr. 3)

mit besten Grüßen
Nick



Ich vermute, dass es aktuell daran liegt, dass ich noch nicht die Zeit bei meiner Formatierung berücksichtige, leider liegen die Datums/Zeitangaben als Text vor, daran kann ich nichts ändern.

Dann mache einen Timestamp draus, to_timestamp() ist Dein Freund. Und verwende in Zukunft korrekte Datentypen. Dazu sind diese da.