Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Abfrage für jüngstes Datum, jeweils bezogen auf einen Wert

Begonnen von FlyingFlo, November 24, 2014, 14:12:43

⏪ vorheriges - nächstes ⏩

FlyingFlo

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

DF6GL

Hallo,
etwa so:


select max(datErstellt),   lngIDProjekte from Ursprungstabelle Group by lngIDProjekte

FlyingFlo

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

ebs17

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
Mit freundlichem Glück Auf!

Eberhard

FlyingFlo

#4
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

ebs17

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.
Mit freundlichem Glück Auf!

Eberhard

FlyingFlo

Ah, danke, so funktioniert es!

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