Frühestes Datum und sein nachfolger

Guten Morgen zusammen.
Ich betreue derzeit eine Datenbank zur Verwaltung von Messwerten, welche Höheninformationen bereitstellen.
Im Zuge dessen ist es nun relevant, das Datum der Nullmessung (frühestes Datum) und seinen Nachfolger herauszufiltern. Nachfolgend habe ich mal beispielhaft einen Ausschnitt der relevanten Daten mit angefügt.
Mein bisheriger Ansatz: Das früheste Datum finde ich über die “min-Funktion” heraus. Den Nachfolger wollte ich über die lead bzw. lag Funktion filtern. Diese stellt mich aber seit geraumer Zeit vor Probleme. Deshalb meine Frage: Ist dies für meine Fragestellung überhaupt der richtige Ansatz?

Mit freundlichen Grüßen
Sammer
PGForum_neu.PNG

wie wäre es mit

select * from table order by datum asc limit 2

Das liefert Dir 2 Datensätze…

Ja richtig. Die Tabelle zeigt jedoch nur die Werte für einen Punkt. Die Datenbank enthält mehrere Tausende Punkte vor, zu denen wiederum verschiedene Messwerte zugeordnet sind.
Mich interessiert nun 2 Datums je Punkt.

Meinst Du sowas?

select *
from (
   select *, row_number() over (partition by punkt order by datum desc) as rn
   from the_table
) t 
where rn <= 2;

Genau das geht in die richtige Richtung. Bei dieser Abfrage werden die beiden zuletzt eingetragenen Datums angezeigt. Ich möchte aber chronologisch gesehen die beiden “frühesten”. Im Beispiel wären das die Jahre 1936 und 1954.

dann sortiere anders (asc). Etwas Eigeninitiative bitte …

Vielen Dank erstmal für die Antworten. Habe jetzt meine gewünschte Abfrage formuliert, die sich wie folgt darstellt:

select t.gp_nr,k.rechtswert,k.hochwert,t.datum
from (select *, row_number() over (partition by gp_nr order by datum asc) as rn
   from ta_messdaten) t, ta_kopfdaten k
where rn <= 2 and exists (select * from ta_messdaten m where m.datum > date '2011-12-31' and m.gp_nr = t.gp_nr) and t.gp_nr in (select gp_nr from ( select gp_nr,count(*) from ta_messdaten group by gp_nr) b where count >=2) and t.gp_nr=k.gp_nr

Hier enthalte ich nun auch das gewünschte Ergebnis.
Besteht die Möglichkeit, die Abfrage so umzuformen, dass ich beide Datums aus einer Abfrage erhalte. Derzeit sind ja zwei Abfragen notwendig um zumal das früheste und im zweiten Durchlauf das nachfolge Datum zu erlangen.

Das Ergebnis stellt sich beispielsweise wie folgt dar.

gp_nr rechtswert hochwert Datum
1022 70354.00 34273.00 1936-06-30 (entspricht Nullmessung)
1022 70354.00 34273.00 1958-06-30 /entspricht Folgemessung)

ich möchte aber gerne die Ergebnisse geballt haben:
1022 70354.00 34273.00 1936-06-30 1958-06-30

dann halt aggregieren. array_agg() oder string_agg() sind Deine Freunde.

Einfach das Ergebnis mit den zwei Datensätzen zweimal zu den Kopfdaten joinen:

with messwerte as (
 select *
 from (
   select *, 
          row_number() over (partition by gp_nr order by datum asc) as rn
   from ta_messdaten
 ) t
 where t.rn <= 2
)
select k.gp_nr, k.rechtswert, k.hochwert, m1.datum as erstes_datum, m2.datum as zweites_datum
from ta_kopfdaten k
  join messwerte m1 on k.gp_nr = m1.gp_nr and m1.rn = 1
  join messwerte m2 on k.gp_nr = m2.gp_nr and m2.rn = 2;

Wenn es immer ein zweites Datum gibt, dann ist das obige OK. Wenn es unter Umständen kein zweites Datum geben kann, dann muss der zweite join ein outer join sein, also “LEFT join messwerte m2 …” (wenn es unter Umständen auch kein erstes Datum gibt, Du die Kopfdaten trotzdem sehen willst, dann muss natürlich auch der erste join ein outer join sein)