Letzten Eintrag finden

Hallo,

Irgendwie komme ich gerade nicht voran. Habe folgende Tabelle (sinngemäß):

name | wert

ball | fuß
ball | hand
hhhh | test

Zudem hat jeder Eintrag einen Timestamp. Ich brauche nun jeweils den letzten wert für jeden name, sprich hier:

ball hand
hhhh test

Ich kann nun mit Group By name erreichen, dass nur ein Name gezeigt wird, nur leider der erste. Auch ein OrDER BY timestamp DESC ändert das leider nicht.

Hat da jemand eine Idee wie ich den zweiten Ball-wert bekomme?

Danke für die Hilfe :smile:

Hallo,

verwende eine Subquery in der Du Dir den ältesten Timestamp pro Eintrag suchst und in der Hauptquery auf Eintrag und Timestamp filterst. Schon hast Du was Du brauchst.

Grüße
PerryRhodan

Sorry falls ich gerade den Überblick verloren habe, aber dein Subquery, also das Rausfinden des ältesten Eintrags je name, genau das ist doch wieder das Ausgangsproblem, oder sehe ich da gerade etwas nicht?

name | wert

ball | fuß
ball | hand
hhhh | test

  1. Query Max erzeugen:
    select name, max(Timestamp) as MaxTimestamp from Tabelle
    GROUP BY name;

->
ball | 10:00
hhh | 11:00

SELECT Tabelle.*
FROM Tabelle,Max where Tabelle.Timestamp=Max.MaxTimestamp

->
ball | hand | 10:00
hhh | test | 11:00

Hallo,

Irgendwie komme ich gerade nicht voran. Habe folgende Tabelle
(sinngemäß):

name | wert | datumzeit

ball | fuß | 2009-08-11 10:00:00
ball | hand | 2009-08-11 11:00:00
hhhh | test | 2009-08-11 10:00:00

SELECT name, wert, datumzeit
FROM (
SELECT name, wert, datumzeit
FROM www_test_order
ORDER BY datumzeit DESC
)
AS preorderdatetime
GROUP BY name ASC

da seh ich aber ein problem wenn es 2 zeiteinträge gleichen wertes gibt. es wird dann nähmlich der erste name genommen , wo maxzeit bei beiden gleich ist. Und das wäre nicht wirklich richtig, wenn der 2 name zuletzt eingegeben wurde.

Nein, eben nicht - wegen der Gruppierung nach Namen.

)

Max hätte ich halt in ein Subquery verpackt, aber prinzipiell die gleiche Lösung wie von mir angesprochen.

jo :smile:

dennoch zur vollständigkeit will ich nochmal die falle mit aggregat funktionen aufzeigen . Da dort keine der vorgeschlagenen Lösungen (also auch meine) einen echten erfolg verbucht.

Es ist theorie aber offt resultiert daraus dann falsche ergebnisse da indexe nicht genutz oder vorhanden sind.

*****************

vorsicht bei aggregat funktionen

Vorgabe :
angenommen wir haben eine stempeluhr die 15minuten weiter schaltet.
die leute arbeiten in einer section und haben einen namen ,
in dieser reihenfolge sind die daten eingeganen von heute.

section name zeit
gruppe ingo 10:00:00
gruppe thomas 10:00:00
gruppe thomas 16:00:00
gruppe ingo 16:00:00
masse rene 10:00:00
masse igor 10:00:00
masse rene 16:00:00
masse igor 16:00:00

Frage :
Wer hat aus welcher Sektion als letztes gestempelt.

Datenbank Querry

SELECT section, max( zeit ) AS maxzeit
FROM www_test_order
GROUP BY section

gruppe 16:00:00
masse 16:00:00

SELECT section, name,zeit FROM www_test_order, max where zeit=maxzeit

falsches Ergebnis :
gruppe thomas 16:00:00
gruppe ingo 16:00:00
masse rene 16:00:00
masse igor 16:00:00

ok ich mach dann nochmal ein group by daraus
SELECT section, name,zeit FROM www_test_order, max where zeit=maxzeit GROUP by section

oder

SELECT section, name, zeit FROM ( SELECT section, name, zeit FROM www_test_order ORDER BY zeit DESC ) AS preorderdatetime GROUP BY section ASC

immernoch falsches Ergebnis :
gruppe thomas 16:00:00
masse rene 16:00:00

richtiges Ergebnis kann nicht ermittelt werden :
gruppe ingo 16:00:00
masse igor 16:00:00

Ergo :
wir sehen also der record (datensatz) wird bei anwendung von max() nicht erhalten.
Beim weiteren select haben wir keinen index der den eingang der gleichzeitgen stempel
der gleichen 15 minuten unterscheidet.

Keine der Methoden kann greifen , da es nicht den letzten sondern die letzen wenn überhaupt zeigt.

Der Pfördner am Stempelautomat würd jedenfals sagen ingo und igor sind als letztes rausgegangen.

In solchen fällen sollte ein index her der die reihenfolge der eingänge belegt :smile:

P.S. selbstkritik, schreibfehler geben einen punkt pro fund (-)