aktuellster Datensatz...

Hallo zusammen,
hatte letze Woche schon ein Beitrag drinnen mit ähnlicher Frage.
habe eigentlich eine einfache Aufgabe, aber keine Ahnung wie die Lösung aus schaut.
Folgende Tabelle mit Datensätzen. Ich möchte jetzt gruppiert nach Spalte test den aktuellsten Datensatz(höchste zeit) erhalten, aber hab kein Ahnung wie :confused:

id;test;beschreibung;zeit
1;“test1”;“a”;“10:17:10.497286”
2;“test1”;“b”;“10:17:16.545288”
3;“test1”;“c”;“10:17:21.36935”
4;“test2”;“b”;“10:17:26.577364”
5;“test2”;“a”;“10:17:31.29724”
6;“test2”;“c”;“10:17:34.51331”
7;“test3”;“c”;“10:17:38.409279”
8;“test3”;“a”;“10:17:41.76935”
9;“test3”;“b”;“10:17:44.689349”

rauskommen sollte also
test1;c
test2;c
test3;b


Sicher einfach, aber ich hänge grade.

Danke schon mal

Gruß
Andreas

Aus der Hüfte ohne zu testen: select distinct on (test) test, beschreibung order by test, zeit desc;

Andreas

Den Einbau der Tabelle in das obige Statement überlasse ich Dir zur Übung :wink:

Andreas

Hallo Andreas,
die fehlende from Clausel hab ich recht schnell entdeckt :wink:
Der SQL funktioniert auch, aber nur auf dieses Beispiel und eher zufällig
glaube ich.
Distinct reduziert ja Werte die mehrfach auftreten auf einen, nur nach welchen Kriterien? Ich bräuchte ja den aktuellsten, nach einer Zeit bzw. Datums- Spalte.

hmm komm da nicht wirklich weiter, das kann doch nicht so schwer sein oder?

Hast mir vielleicht noch einen Tip`?

Danke schon mal

Gruß
Andreas

Exakt. DISTINCT on (test) redurziert es auf einen unique Wert von test, order by test, zeit desc sortiert es nach zeit, test absteigend. Das DISTINCT on redurziert also auf je einen Wert von test, und zwar den ersten gemäß Sortierordnung. Diese ist, vlööig zufällig, so wie Du das wolltest.

DISTINCT ON() ist eine PostgreSQL-Erweiterung.


Andreas

oje immer diese Montage…
klar, es funzt wunderbar nach einfügen der richtigen
Sortiereung :astonished:

Vielen Dank nochmal


Gruß
Andreas

Es gäbe noch einen anderen Weg, über windowing functions (CTE). Ist aber langsamer:

Zuerst einmal zählen wir je Gruppe test, absteigend nach zeit:

test=*# select *, row_number() over(partition by test order by zeit desc) from minor73;
 id | test  | beschreibung |      zeit       | row_number
----+-------+--------------+-----------------+------------
  3 | test1 | c            | 10:17:21.36935  |          1
  2 | test1 | b            | 10:17:16.545288 |          2
  1 | test1 | a            | 10:17:10.497286 |          3
  6 | test2 | c            | 10:17:34.51331  |          1
  5 | test2 | a            | 10:17:31.29724  |          2
  4 | test2 | b            | 10:17:26.577364 |          3
  9 | test3 | b            | 10:17:44.689349 |          1
  8 | test3 | a            | 10:17:41.76935  |          2
  7 | test3 | c            | 10:17:38.409279 |          3
(9 rows)

Überall, wo row_number = 1 ist, liegen unsere gesuchten Datensätze:

test=*# with t as (select *, row_number() over(partition by test order by zeit desc) from minor73) select test, beschreibung from t where row_number = 1;
 test  | beschreibung
-------+--------------
 test1 | c
 test2 | c
 test3 | b
(3 rows)

Andreas