Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Doppelte Einträge anhand des Timestamps erfassen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von trmax, 16 Dezember 2019.

  1. trmax

    trmax Neuer Benutzer

    Hallo!

    Ich habe eine Tabelle "lorawan", wo ich Temperaturwerte von einem Funkempfänger, welcher mir die Werte der Temperatursensoren empfängt, alle 10 Minuten speichere. (1 Wert ca. alle 10 Minuten +/- einige Sekunden)

    Die Tabelle hat folgenden Aufbau:

    ID | DATE| TEMP | DEVEUI

    "Date" ist ein Timestamp im Format 2019-12-08 09:44:41
    "DEVEUI" ist die Seriennummer des Sensors, nach der ich bei der Abfrage Suche. Es gibt 2 Sensoren, die in die Tabelle "lorawan" schreiben.

    Jetzt ist es so, dass ich manchmal doppelte Einträge habe, die max. 5 Sekunden auseinander liegen. Diese möchte ich finden, und jeweils einen davon löschen. Die Einträge kommen daher, dass die Sensoren an mehrere Empfangsstationen senden, und diese dann die Einträge doppelt speichern, wenn sie mehr als 500ms auseinander liegen. Die Zeitverschiebung von bis zu 5 Sekunden ist mit der Laufzeit zu begründen.

    Welches Statement benötige ich, um die doppelten Einträge zu entferne?

    liebe Grüße,
    Markus
     
  2. trmax

    trmax Neuer Benutzer

    Ein doppelter Eintrag schaut so aus, wobei der Zeitstempel lediglich wenige Sekunden vom anderen abweicht. Einer der beiden sollte also gelöscht werden
     

    Anhänge:

    • 1.JPG
      1.JPG
      Dateigröße:
      58,6 KB
      Aufrufe:
      3
  3. akretschmer

    akretschmer Datenbank-Guru

    Okay, mal vereinfacht:

    Code:
    test=*# select * from trmax;
     id |         ts          | temp
    ----+---------------------+------
      1 | 2019-12-16 10:00:00 |   20
      2 | 2019-12-16 10:10:00 |   15
      3 | 2019-12-16 10:20:00 |   17
      4 | 2019-12-16 10:20:10 |   17
      5 | 2019-12-16 10:30:00 |   14
    (5 rows)
    
    Okay, Du wiullst nun offenbar den Datensatz mit ID=4 löschen, oder?

    Code:
    test=*# select *, case when ts - lag(ts) over (order by ts) < '3 minutes'::interval then true else false end as delete from trmax;
     id |         ts          | temp | delete
    ----+---------------------+------+--------
      1 | 2019-12-16 10:00:00 |   20 | f
      2 | 2019-12-16 10:10:00 |   15 | f
      3 | 2019-12-16 10:20:00 |   17 | f
      4 | 2019-12-16 10:20:10 |   17 | t
      5 | 2019-12-16 10:30:00 |   14 | f
    (5 rows)
    
    Das 't' in Spalte delete heißt ja TRUE ;-)

    Code:
    test=*# with delete as (select id, case when ts - lag(ts) over (order by ts) < '3 minutes'::interval then true else false end as delete from trmax) delete from trmax where id in (select id from delete where delete);
    DELETE 1
    test=*# select * from trmax;
     id |         ts          | temp
    ----+---------------------+------
      1 | 2019-12-16 10:00:00 |   20
      2 | 2019-12-16 10:10:00 |   15
      3 | 2019-12-16 10:20:00 |   17
      5 | 2019-12-16 10:30:00 |   14
    (4 rows)
    
    Einfach, oder?
     
  4. trmax

    trmax Neuer Benutzer

    Danke ich werde es testen und melde mich wieder!

    lg
     
  5. trmax

    trmax Neuer Benutzer

    Code:
    select *, case when DATE - lag(DATE) over (order by DATE) < '3 minutes'::interval then true else false end as delete from lorawan_tummelplatz;
    habs angepasst. irgenwie wirft es mir einen Fehler

     
  6. akretschmer

    akretschmer Datenbank-Guru

    nun ja, ich habe PostgreSQL ...
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden