Daten aggregieren mit max

PetraSteiner

Fleissiger Benutzer
Beiträge
60
Hallo,

ich habe folgende Daten als Beispiel:
ID Nummer......
1 8310 450 12 13 2020-01-01 13:19:28.109953
2 8310 450 12 14 2020-01-01 13:21:28.109953
3 8310 450 13 13 2020-01-01 13:25:28.109953
4 8930 450 33 12 2020-01-01 13:39:28.109953

usw.

Wie kann ich von jeder Nummer (2. Spalte) nur den Wert rausziehen mit dem höchsten Timestamp?
In der Theorie wäre max() eventuell ein Lösungsansatz?
 
Zuletzt bearbeitet:
Werbung:
Danke. Ich drücke immer auf die falsche Taste und der Post wurde frühzeitig abgeschickt.
Der max greift irgendwie nicht, weil hier in den anderen Spalten unterschiedliche Werte stehen.
Aus 4 Zeilen sollte eine werden. Es werden aber immer 4 angezeigt.
Geht das überhaupt so?
 
Du widersprichst Dich, Erst soll je Nummer (2te Spalte) ein Wert (Frage: welche Spalte?) ausgegeben werden, Du hast in der zweiten Spalte 2 untersch. Nummern, daher ging ich von 2 Ergebnisszeilen aus. Nun soll aus 4 Zeilen nur noch eine werden. Erkläre bitte die Logig.

Und: stelle es so dar, daß es leicht nachvollziehbar ist. Es gibt Code-Tags zur Formatierung. Ideal wären DDL-Befehle zur Erzeugung der Tabelle und Insert-Befehle zum befüllen.
Und: wenn Du schreibst, daß Du 4 Zeilen erhälst, nicht aber das SQL dazu, können wir nur noch raten, was Du als SQL verwendest.
 
Unter Postgres kann man das sehr elegant mit DISTINCT ON lösen:
Code:
select distinct on (nummer) *
from the_table
order by nummer, timestamp_wert desc;

Alternativ kann man das auch mit einer Window Function machen - das ist aber meistens langsamer:
Code:
select id, nummer, timestamp_wert
from (
  select *, row_number() over (partition by nummer order by timestamp_wert desc) as rn
  from the_table
) x
where rn = 1;
 
Danke, ich versuche es:


Code:
CREATE TABLE "test" (
  "id" integer NOT NULL,
  "eins" integer NOT NULL,
  "zwei" integer NOT NULL,
  "drei" integer NOT NULL,
  "created_at" timestamp NOT NULL
);

INSERT INTO "test" ("id", "eins", "zwei", "drei", "created_at") VALUES
(1001,    12,    12,    12,    '2020-01-01 20:11:18.628197'),
(1002,    13,    12,    41,    '2020-01-01 20:11:38.457805'),
(1003,    12,    123123,    34534,    '2020-01-01 20:12:01.606236'),
(1004,    13,    123123,    345,    '2020-01-01 20:12:31.562707'),
(1005,    12,    13,    12123,    '2020-01-01 20:12:59.443298');

Die Spalte "eins" ist jetzt interessant. Das sind jetzt 5 Datensätze. Ich möchte aber nur 2.
Und zwar in Spalte ein die 12 und 13 mit dem höchsten Wert von created_at.
So ist mein Vorhaben hoffentlich einfacher zu verstehen.
 
Code:
test=*# select eins, max(created_at) from test group by eins;
 eins |            max             
------+----------------------------
   13 | 2020-01-01 20:12:31.562707
   12 | 2020-01-01 20:12:59.443298
(2 rows)
 
Code:
SELECT eins, zwei, drei, max(created_at)
FROM test
GROUP BY eins, zwei, drei
Das geht nicht. Ich erkläre mir das so, dass die Spalten alle unterschiedlich sind und die DB das nicht zusammenfassen kann.
 
Danke akretschmer. Hat sich gerade überschnitten. Wenn ich weitere Spalten benötigte, geht das so nicht mehr. Gibt es hier auch eine Möglichkeit?
 
alternativ, aber nicht nicht portabel:

Code:
test=*# select distinct on (eins) * from test order by eins, created_at desc;
  id  | eins |  zwei  | drei  |         created_at         
------+------+--------+-------+----------------------------
 1005 |   12 |     13 | 12123 | 2020-01-01 20:12:59.443298
 1004 |   13 | 123123 |   345 | 2020-01-01 20:12:31.562707
(2 rows)

distinct on (...) ist eine PostgreSQL-spezifische Erweiterung.
 
ja:

Code:
test=*# select * from test where (eins, created_at) in (select eins, max(created_at) from test group by eins);
  id  | eins |  zwei  | drei  |         created_at         
------+------+--------+-------+----------------------------
 1004 |   13 | 123123 |   345 | 2020-01-01 20:12:31.562707
 1005 |   12 |     13 | 12123 | 2020-01-01 20:12:59.443298
(2 rows)
 
Werbung:
Zurück
Oben