PDA

Vollständige Version anzeigen : Nur Datensatz mit dem neuesten Datum auswählen


Amarel
28.04.2011, 09:24
Guten Tag.

Einfaches Problem, bei dem ich gerade auf dem Schlauch stehe :p

Ich habe eine Tabelle der Form:
Name / Status / Datum

Ich möchte für einen Namen nur den aktuellsten Datensatz (also mit dem neuesten Status) ausgeben.

Wie sieht dann da die passende sql-Abfrage aus?

Danke fürs vom Schlauch schubsen.

kama
28.04.2011, 09:33
z.Beispiel:
SELECT TOP 1 DieTabelle.DerName, DieTabelle.DasDatum
FROM DieTabelle
WHERE (((DieTabelle.DerName)="GewünschterName"))
ORDER BY DieTabelle.DasDatum DESC;

Amarel
28.04.2011, 09:43
Merke: Erst Antwort richtig lesen, dann posten... Porbiere ich mal aus.

Amarel
28.04.2011, 09:54
Damit bekomme ich für einen speziellen Namen den entsprechenden Datensatz.
Was ist, wenn ich die aktuellens Stati für verschiedene Namen brauche?
Ich versuchs mal mit Beispiel.

Wenn ich in der Tabelle die Datensätze haben:
Meier/Angemeldet/1.1.2011
Meier/Rückmeldung/2.3.2011
Meier/Teilgenommen/3.4.2011
Schulze/Angemeldet/2.3.2011
Schulze/Abgemeldet/3.3.2011


Dann möchte ich als Ausgabe der Abfrage nur die Datensätze:
Meier/Teilgenommen/3.4.2011
Schulze/Abgemeldet/3.3.2011

kama
28.04.2011, 10:07
Bitte, aber nicht besonders hilfreich wenn es mehre Meiers etc gibt. Für die Namen sollte ein eindeutiger Schlüssel festgelegt werden z.B. Autowert.
SELECT DieTabelle.DerName, Last(DieTabelle.DerText) AS
LetzterWertvonDerText, Last(DieTabelle.DasDatum) AS LetzterWertvonDasDatum
FROM DieTabelle
GROUP BY DieTabelle.DerName;

Amarel
28.04.2011, 11:59
Danke für die Antwort.

Es kann nur einen Meier geben! Soll heißen: In der DB haben die Leute natürlich laufende Nummern.

Aber irgdenwie klappt es mit dem Auswählen immer noch nicht so wie es soll

Daten in Tabelle:
1 - 01.05.2011 - Teilgenommen
1 - 01.01.2011 - Gebucht
17 - 01.02.2011 - Irgendwas
17 - 02.02.2011 - Zusatz
17 - 01.09.2011 - Gebucht

SQL



SELECT
tbl_Seminare_Teilnehmer.LfdNr_Teilnehmer, Last(tbl_Seminare_Teilnehmer.Datum) AS [LetzterWert von Datum],
Last(tbl_Seminare_Teilnehmer.Status) AS [LetzterWert von Status]
FROM tbl_Seminare_Teilnehmer
GROUP BY tbl_Seminare_Teilnehmer.LfdNr_Teilnehmer,
ORDER BY tbl_Seminare_Teilnehmer.LfdNr_Teilnehmer



Und das kommt raus.

1 - 01.05.2011 - Teilgenommen
17 - 01.02.2011 - Irgendwas


Dabei sollte für Nr. 17 doch eigentlich rauskommen:

17 - 02.02.2011 - Zusatz

Wo könnte es da bei mir haken?

Atrus2711
28.04.2011, 12:11
Hi,

du hast zwei Irrtümer in der SQL:

du hast Last() statt Max() verwendet. Diese Funktionen sind nicht gleichwertig. Für das zeitlich höchste Datum brauchst du Max(). Last kann allenfalls bei anderen Sortierabfolgen interessant werden.
du ermittelst pro Kunde den last/max Datum und den last/max Status - unabhängig voneinander! Das ist aber wohl nicht was du willst. Du willst pro Kunde den Status zum last/max Datum des Kunden.


Ermittle also erstmal pro Kunde nur (!) das maximale Datum. Und dann - in einer zweiten Abfrage - den Status des Kunden zum MaxDatum.

ebs17
28.04.2011, 15:43
SELECT T.*
FROM tbl_Seminare_Teilnehmer AS T
INNER JOIN
(SELECT X.LfdNr_Teilnehmer, Max(X.Datum) AS MaxDatum
FROM tbl_Seminare_Teilnehmer AS X
GROUP BY X.LfdNr_Teilnehmer) AS Y
ON T.LfdNr_Teilnehmer = Y.LfdNr_Teilnehmer
AND T.Datum = Y.MaxDatum

Amarel
03.05.2011, 09:46
Vielen Dank @ebs17, das ist genau das was ich gesucht habe und @Atrus2711 für die SQL-Auffrischung.