Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: FlyingFlo am November 24, 2014, 14:12:43

Titel: Abfrage für jüngstes Datum, jeweils bezogen auf einen Wert
Beitrag von: FlyingFlo am November 24, 2014, 14:12:43
Hallo zusammen,

am Besten geht es am Beispiel.
Meine Ursprungstabelle:

IDProjektlaufzeit   datErstellt   lngIDProjekte
1                          01.11.2014   1
2                          02.11.2014   1
3                          03.11.2014   5
4                          04.11.2014   5
5                          04.11.2014   5
7                          06.11.2014   1

Nach einer SQL-Abfrage soll das Ergebnis so aussehen:

IDProjektlaufzeit   datErstellt   lngIDProjekte
4                          04.11.2014   5
5                          04.11.2014   5
7                          06.11.2014   1

In Worten:
Für jeden Wert im Feld "lngIDProjekt" soll geprüft werden, welcher Datensatz das jüngste Datum enthält. Im Beispiel ist hier der jüngste Datensatz für das Projekt "1" der Datensatz mit der IDProjektlaufzeit 7.

Könnt ihr mir da behilflich sein? Wie kann die SQL-Abfrage aussehen?

Danke und mfg, Florian
Titel: Re: Abfrage für jüngstes Datum, jeweils bezogen auf einen Wert
Beitrag von: DF6GL am November 24, 2014, 16:49:10
Hallo,
etwa so:


select max(datErstellt),   lngIDProjekte from Ursprungstabelle Group by lngIDProjekte
Titel: Re: Abfrage für jüngstes Datum, jeweils bezogen auf einen Wert
Beitrag von: FlyingFlo am November 25, 2014, 08:38:55
Hallo,
danke. Das ist noch nicht genau das, was ich brauche.
Bei der vorgeschlagenen Abfrage lautet das Ergebnis

datErstellt   lngIDProjekte
04.11.2014   5
06.11.2014   1

Die Satzensätze werden also gruppiert und deshalb ist nicht mehr ersichtlich, welcher Datensatz das ist.

Ich brauche aber einen eindeutigen Datensatz, deshalb habe ich die Tabelle noch um eine Zeit erweitert:

IDProjektlaufzeit   datDatErstellt  datZeitErstellt lngIDProjekte
1                           01.11.2014      12:00:00          1
2                           02.11.2014      13:00:00          1
3                           03.11.2014      14:00:00          5
4                           04.11.2014      15:00:00          5
5                           04.11.2014      16:00:00          5
6                           06.11.2014      17:00:00          1

(zur Info: Die Tabelle enthält in Wirklichkeit weitere Spalten)

Das Ergebnis soll nun so aussehen:

IDProjektlaufzeit   datDatErstellt   datZeitErstellt   lngIDProjekte
5                           04.11.2014       16:00:00            5
6                           06.11.2014       17:00:00            1

Habt ihr eine Idee für eine passende SQL-Abfrage?

Danke! Florian
Titel: Re: Abfrage für jüngstes Datum, jeweils bezogen auf einen Wert
Beitrag von: ebs17 am November 25, 2014, 09:23:33
Der gezeigte Weg war schon richtig. Man muss nur nach der Berechnung (Max pro ID) die übrigen Daten hinzuverknüpfen:
SELECT
    A.*
FROM
    Ursprungstabelle AS A
        INNER JOIN
            (
                SELECT
                    lngIDProjekte,
                    MAX(datDatErstellt + datZeitErstellt) AS MaxZP
                FROM
                    Ursprungstabelle
                GROUP BY
                    lngIDProjekte
            ) AS B
            ON A.lngIDProjekte = B.lngIDProjekte
                AND
            A.datDatErstellt = B.datDatErstellt
                AND
            A.datZeitErstellt = B.datZeitErstellt
Titel: Re: Abfrage für jüngstes Datum, jeweils bezogen auf einen Wert
Beitrag von: FlyingFlo am November 25, 2014, 13:40:31
Hallo,
danke schon mal!

Die Abfrage funktioniert noch nicht, weil die Felder "B.datZeitErstellt" und "B.datDatErstellt" in der erzeugten Tabelle B gar nicht existieren. Hinzufügen kann ich sie auch nicht, weil dann die Fehlermeldung "Sie wollten eine Abfrage ausführen, die den angegebenen Ausdruck 'datZeitErstellt' nicht als Teil der Aggregatfunktion einschließt".

Hast du noch eine Idee, wie das zu lösen wäre?

Danke, Florian
Titel: Re: Abfrage für jüngstes Datum, jeweils bezogen auf einen Wert
Beitrag von: ebs17 am November 25, 2014, 16:47:18
Ach ja, es muss etwas anders verknüpft werden:
...
            ON A.lngIDProjekte = B.lngIDProjekte
                AND
            A.datDatErstellt + A.datZeitErstellt = B.MaxZP


Hier im Anwendungsfall wäre es günstiger, wenn Datum und Zeit gleich in einem Tabellenfeld zusammengefasst wären, weil sich dann in der Abfrage eine Nutzung eines Index auf das Feld ergeben kann.
Titel: Re: Abfrage für jüngstes Datum, jeweils bezogen auf einen Wert
Beitrag von: FlyingFlo am November 26, 2014, 08:07:29
Ah, danke, so funktioniert es!

Ich habe nach deinem Vorschlag Datum und Zeit in einem Feld zusammengefasst, auch das funktioniert einwandfrei.