Mit Select aus Logging-Tabelle den letzten Stand herausfinden

creativeone

Benutzer
Beiträge
17
Wieder meine Tabelle wo Gerätetests eingetragen sind, die Tabelle ist vereinfacht so aufgebaut:

  • id
  • timestamp
  • geraet_id
  • typ_id (OK, steht eigentlich in einer separaten Tabelle, die unter der Tabelle liegt weil es mehrere typen geben kann, aber das tut glaub ich nix zur sache)

Die typ_id kann bei jedem Test wechseln.

Ich möchte eine Liste machen mit der ich herausfinde, wieviele Geräte gibt es pro typ_id. Es zählt aber immer nur der aktuelle Stand, also zeitlich der letzte. Was also nicht funktioniert ist ein normaler GROUP BY typ_id mit einem count, bekomme sonst ja alle historischen Daten mit.

Schönes neues Jahr und danke für eure Hilfe! 😎
 
Werbung:
Aber select typ_id, max(timestamp), count(*) group by typ_id liefert mir dann bloss das höchste Datum! Der count liefert mir in dem Select ja die Summe pro Typ-Id - ich brauche aber nur immer den letzten Datensatz pro Gerät und davon die Summe pro typ_id. Ich will ja wissen, wieviele pro typ_id gibt es aktuell = letzter Datensatz.

Verstehst du, was ich meine?
 
Mal ein paar Beispieldaten:

SQL:
CREATE TABLE creativeone ( visit_id INT UNSIGNED NOT NULL AUTO_INCREMENT , geraete_id INT NOT NULL , datum TIMESTAMP NOT NULL , typ_id SMALLINT UNSIGNED NOT NULL , PRIMARY KEY (visit_id)) ENGINE = InnoDB;

INSERT INTO creativeone (visit_id, geraete_id, datum, typ_id)
VALUES (1, 1, '2021-01-01', 1),
(2, 2, '2021-01-01', 1),
(3, 1, '2021-01-02', 2),
(4, 1, '2021-01-04', 2),
(5, 1, '2021-01-08', 3),
(6, 3, '2021-01-09', 1),
(7, 3, '2021-01-10', 3);

Pro Gerät darf nur der Datensatz berücksichtigt werden der den grössten Timestamp hat (=letzter Eintrag). Zu ignorieren sind also die Datensätze mit der visit_id 1, 3, 4 (Gerät 1) und 6 (Gerät 3); zu berücksichtigen 2, 5 und 7.

Heraus kommt also:
Typ 1 Anzahl 1
Typ 3 Anzahl 2
 
mit Zwischenschritt zum besseren Verständniss...

Code:
edb=*# select * from creativeone;
 visit_id | geraete_id |        datum        | typ_id 
----------+------------+---------------------+--------
        1 |          1 | 2021-01-01 00:00:00 |      1
        2 |          2 | 2021-01-01 00:00:00 |      1
        3 |          1 | 2021-01-02 00:00:00 |      2
        4 |          1 | 2021-01-04 00:00:00 |      2
        5 |          1 | 2021-01-08 00:00:00 |      3
        6 |          3 | 2021-01-09 00:00:00 |      1
        7 |          3 | 2021-01-10 00:00:00 |      3
(7 rows)

edb=*# with tmp as (select geraete_id, max(datum) datum from creativeone group by geraete_id) select * from creativeone inner join tmp using (geraete_id,datum);
 geraete_id |        datum        | visit_id | typ_id 
------------+---------------------+----------+--------
          2 | 2021-01-01 00:00:00 |        2 |      1
          1 | 2021-01-08 00:00:00 |        5 |      3
          3 | 2021-01-10 00:00:00 |        7 |      3
(3 rows)

edb=*# with tmp as (select geraete_id, max(datum) datum from creativeone group by geraete_id), tmp2 as (select typ_id from creativeone inner join tmp using (geraete_id,datum)) select typ_id, count(1) from tmp2 group by typ_id;
 typ_id | count 
--------+-------
      1 |     1
      3 |     2
(2 rows)

edb=*#
 
Werbung:
Super Lösung! 👍

Hat mir auch bei meinem Problem geholfen:
 
Zurück
Oben