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

Zählen von Hochpunkten

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von freehawk, 15 Januar 2017.

  1. freehawk

    freehawk Benutzer

    Hallo zusammen,

    ich habe in einer Datenbank Werte meiner Heizung gesammelt. Nur würde ich gerne bestimmen wie oft die Heizung angelaufen ist. Dazu kann ich eigentlich nur meine Abgastemperatur auswerten.

    Nun hat wenn ich daraus eine Kurve zeichen lasse, diese Kurve ja immer einen Hochpunkt wenn die Heinzung läuft.

    Kann ich diese Hochpunkte irgendwie mit MySQL gezielt abfragen?

    Ansonsten müsste ich das mit Logik im nachhinein machen.

    Danke

    Gruß
    Markus
     
  2. akretschmer

    akretschmer Datenbank-Guru

    wie sieht denn die Tabelle aus?
     
  3. freehawk

    freehawk Benutzer

    Also ich habe eine eindeutige ID, einen Zeitstempel (Unixtimestamp) und die Temperaturwerte jeweils in einer Spalte.

    Diese Werte werden jede halbe Stunde abgefragt und in die Tabelle geschrieben.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Müßte man sich halt anschauen, wie oft die Heizung angeht (und ob eine halbe Stunde Meßintervall genau genug ist), wie sich das darstellt in den Werten etc. Du kannst vergleichen, ob der Wert höher oder niedricher als der letzte Wert ist (ach nee, Du hast MySQL, das hat keine lag() - Funktion, evtl. mal googeln, was es da als Alternative gibt).
     
  5. freehawk

    freehawk Benutzer

    also von den daten her ist es kein problem, das habe schon gecheckt
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Dann ist ja super und der Lösung steht nicht mehr viel im Wege...

    Code:
    test=# create table freehawk(id serial primary key, ts timestamp, wert numeric);
    CREATE TABLE
    test=*# insert into freehawk (ts, wert) select '2017-01-10 00:00:00'::timestamp + s * '39minutes'::interval, random() * 80 from generate_series(0, 100) s;
    INSERT 0 101
    
     id  |  ts  |  wert  |  brenner   
    -----+---------------------+--------------------+------------
      1 | 2017-01-10 00:00:00 |  34.2648424953222 |
      2 | 2017-01-10 00:39:00 |  69.5760302245617 | Brenner an
      3 | 2017-01-10 01:18:00 |  67.4595558270812 |
      4 | 2017-01-10 01:57:00 |  49.569960013032 |
      5 | 2017-01-10 02:36:00 |  32.6921404525638 |
      6 | 2017-01-10 03:15:00 |  26.603631824255 |
      7 | 2017-01-10 03:54:00 |  53.2370558381081 | Brenner an
      8 | 2017-01-10 04:33:00 |  48.2108074426651 |
      9 | 2017-01-10 05:12:00 |  59.557350538671 | Brenner an
      10 | 2017-01-10 05:51:00 |  36.7447316274047 |
      11 | 2017-01-10 06:30:00 |  40.4502646997571 | Brenner an
      12 | 2017-01-10 07:09:00 |  60.4872752353549 | Brenner an
      13 | 2017-01-10 07:48:00 |  68.6767479032278 | Brenner an
      14 | 2017-01-10 08:27:00 |  17.4443533271551 |
      15 | 2017-01-10 09:06:00 |  60.2763060107827 | Brenner an
      16 | 2017-01-10 09:45:00 |  17.7019734680653 |
      17 | 2017-01-10 10:24:00 |  33.6292626708746 | Brenner an
      18 | 2017-01-10 11:03:00 |  22.9248889163136 |
      19 | 2017-01-10 11:42:00 |  78.419106900692 | Brenner an
      20 | 2017-01-10 12:21:00 |  22.3269063979387 |
      21 | 2017-01-10 13:00:00 |  21.4162293821573 |
      22 | 2017-01-10 13:39:00 |  21.8617947772145 | Brenner an
      23 | 2017-01-10 14:18:00 |  52.1507905423641 | Brenner an
      24 | 2017-01-10 14:57:00 |  47.1629501134157 |
      25 | 2017-01-10 15:36:00 |  60.1466645672917 | Brenner an
      26 | 2017-01-10 16:15:00 |  74.1438134387136 | Brenner an
      27 | 2017-01-10 16:54:00 |  4.27337534725666 |
      28 | 2017-01-10 17:33:00 |  39.9410453438759 | Brenner an
      29 | 2017-01-10 18:12:00 |  70.2574043348432 | Brenner an
      30 | 2017-01-10 18:51:00 |  49.0641271322966 |
      31 | 2017-01-10 19:30:00 |  60.9026057273149 | Brenner an
      32 | 2017-01-10 20:09:00 |  24.5222468301654 |
      33 | 2017-01-10 20:48:00 |  38.6401573568583 | Brenner an
      34 | 2017-01-10 21:27:00 |  48.3621615543962 | Brenner an
      35 | 2017-01-10 22:06:00 |  74.0922068431973 | Brenner an
      36 | 2017-01-10 22:45:00 |  71.332297809422 |
      37 | 2017-01-10 23:24:00 |  74.965793415904 | Brenner an
      38 | 2017-01-11 00:03:00 |  47.3292626813054 |
      39 | 2017-01-11 00:42:00 |  39.5431052520871 |
      40 | 2017-01-11 01:21:00 |  54.5231439545751 | Brenner an
      41 | 2017-01-11 02:00:00 |  4.0739943087101 |
      42 | 2017-01-11 02:39:00 |  79.9933699890971 | Brenner an
      43 | 2017-01-11 03:18:00 |  35.01041918993 |
      44 | 2017-01-11 03:57:00 |  72.7507422491908 | Brenner an
      45 | 2017-01-11 04:36:00 |  17.4377233162522 |
      46 | 2017-01-11 05:15:00 |  15.2867252379656 |
      47 | 2017-01-11 05:54:00 |  10.4527157172561 |
      48 | 2017-01-11 06:33:00 |  51.0669859871268 | Brenner an
      49 | 2017-01-11 07:12:00 |  38.2116141542792 |
      50 | 2017-01-11 07:51:00 |  8.87182261794806 |
      51 | 2017-01-11 08:30:00 |  73.3938924223185 | Brenner an
      52 | 2017-01-11 09:09:00 |  59.6278435364366 |
      53 | 2017-01-11 09:48:00 |  30.7336173951626 |
      54 | 2017-01-11 10:27:00 |  45.5446829646826 | Brenner an
      55 | 2017-01-11 11:06:00 |  26.7907936498523 |
      56 | 2017-01-11 11:45:00 |  10.8802819624543 |
      57 | 2017-01-11 12:24:00 |  39.6884964033961 | Brenner an
      58 | 2017-01-11 13:03:00 |  31.0641689971089 |
      59 | 2017-01-11 13:42:00 |  50.8213273435831 | Brenner an
      60 | 2017-01-11 14:21:00 |  29.9459007382393 |
      61 | 2017-01-11 15:00:00 |  0.128296166658401 |
      62 | 2017-01-11 15:39:00 |  31.7239330708981 | Brenner an
      63 | 2017-01-11 16:18:00 |  54.4681475684047 | Brenner an
      64 | 2017-01-11 16:57:00 |  38.7684535235167 |
      65 | 2017-01-11 17:36:00 | 0.0860946252942085 |
      66 | 2017-01-11 18:15:00 |  48.560354411602 | Brenner an
      67 | 2017-01-11 18:54:00 |  30.1007513701916 |
      68 | 2017-01-11 19:33:00 |  75.0518880411983 | Brenner an
      69 | 2017-01-11 20:12:00 |  15.8896170929074 |
      70 | 2017-01-11 20:51:00 |  69.6438566222787 | Brenner an
      71 | 2017-01-11 21:30:00 |  49.5750320330262 |
      72 | 2017-01-11 22:09:00 |  19.9636114388704 |
      73 | 2017-01-11 22:48:00 |  69.6372266113758 | Brenner an
      74 | 2017-01-11 23:27:00 |  4.58545122295618 |
      75 | 2017-01-12 00:06:00 |  12.7143536880612 | Brenner an
      76 | 2017-01-12 00:45:00 |  7.07494992762804 |
      77 | 2017-01-12 01:24:00 |  19.8721764609218 | Brenner an
      78 | 2017-01-12 02:03:00 |  23.1670694053173 | Brenner an
      79 | 2017-01-12 02:42:00 |  58.1419359520078 | Brenner an
      80 | 2017-01-12 03:21:00 |  58.083790615201 |
      81 | 2017-01-12 04:00:00 |  32.0388920232654 |
      82 | 2017-01-12 04:39:00 |  51.5358283743262 | Brenner an
      83 | 2017-01-12 05:18:00 |  37.7116341888905 |
      84 | 2017-01-12 05:57:00 |  62.7725094184279 | Brenner an
      85 | 2017-01-12 06:36:00 |  17.0805113390088 |
      86 | 2017-01-12 07:15:00 |  64.5024278387427 | Brenner an
      87 | 2017-01-12 07:54:00 |  73.6527914181352 | Brenner an
      88 | 2017-01-12 08:33:00 |  56.7690077424049 |
      89 | 2017-01-12 09:12:00 |  15.5665968731046 |
      90 | 2017-01-12 09:51:00 |  44.4741187617183 | Brenner an
      91 | 2017-01-12 10:30:00 |  6.71490848064423 |
      92 | 2017-01-12 11:09:00 |  15.694893039763 | Brenner an
      93 | 2017-01-12 11:48:00 |  76.1980518326163 | Brenner an
      94 | 2017-01-12 12:27:00 |  61.1830560490489 |
      95 | 2017-01-12 13:06:00 |  54.4633465632796 |
      96 | 2017-01-12 13:45:00 |  76.2841464579105 | Brenner an
      97 | 2017-01-12 14:24:00 |  29.7434104606509 |
      98 | 2017-01-12 15:03:00 |  4.5640979334712 |
      99 | 2017-01-12 15:42:00 |  71.3360345363617 | Brenner an
     100 | 2017-01-12 16:21:00 |  45.6330275535583 |
     101 | 2017-01-12 17:00:00 |  74.2079545930028 | Brenner an
    (101 Zeilen)
    
    Du müßtest nur schauen, wie Du lag() in MySQL emulierst.
     
  7. freehawk

    freehawk Benutzer

    hmm nur zu schauen ob der Wert eines vorher größer ist als der derzeitige wird nicht ganz ausreichend sein, da die Werte ja langsam hochsteigen und dann wieder runterfallen.

    Sieht man ja auch an deinen Werten in der Tabelle, da steht zu oft Brenner an.

    Das Zugreifen müsste ja theoretisch über einen Join gehen...
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Ok, dann halt noch abfragen, ob der nächste Wert wieder kleiner ist:

    Code:
    select *,case when wert > lag(wert) over (order by ts) and lead(wert) over (order by ts) < wert then 'Brenner an' else '' end as brenner from freehawk;
    id  |  ts  |  wert  |  brenner   
    -----+---------------------+--------------------+------------
      1 | 2017-01-10 00:00:00 |  34.2648424953222 |
      2 | 2017-01-10 00:39:00 |  69.5760302245617 | Brenner an
      3 | 2017-01-10 01:18:00 |  67.4595558270812 |
      4 | 2017-01-10 01:57:00 |  49.569960013032 |
      5 | 2017-01-10 02:36:00 |  32.6921404525638 |
      6 | 2017-01-10 03:15:00 |  26.603631824255 |
      7 | 2017-01-10 03:54:00 |  53.2370558381081 | Brenner an
      8 | 2017-01-10 04:33:00 |  48.2108074426651 |
      9 | 2017-01-10 05:12:00 |  59.557350538671 | Brenner an
      10 | 2017-01-10 05:51:00 |  36.7447316274047 |
      11 | 2017-01-10 06:30:00 |  40.4502646997571 |
      12 | 2017-01-10 07:09:00 |  60.4872752353549 |
      13 | 2017-01-10 07:48:00 |  68.6767479032278 | Brenner an
      14 | 2017-01-10 08:27:00 |  17.4443533271551 |
      15 | 2017-01-10 09:06:00 |  60.2763060107827 | Brenner an
      16 | 2017-01-10 09:45:00 |  17.7019734680653 |
      17 | 2017-01-10 10:24:00 |  33.6292626708746 | Brenner an
      18 | 2017-01-10 11:03:00 |  22.9248889163136 |
      19 | 2017-01-10 11:42:00 |  78.419106900692 | Brenner an
      20 | 2017-01-10 12:21:00 |  22.3269063979387 |
      21 | 2017-01-10 13:00:00 |  21.4162293821573 |
      22 | 2017-01-10 13:39:00 |  21.8617947772145 |
      23 | 2017-01-10 14:18:00 |  52.1507905423641 | Brenner an
      24 | 2017-01-10 14:57:00 |  47.1629501134157 |
      25 | 2017-01-10 15:36:00 |  60.1466645672917 |
      26 | 2017-01-10 16:15:00 |  74.1438134387136 | Brenner an
      27 | 2017-01-10 16:54:00 |  4.27337534725666 |
      28 | 2017-01-10 17:33:00 |  39.9410453438759 |
      29 | 2017-01-10 18:12:00 |  70.2574043348432 | Brenner an
      30 | 2017-01-10 18:51:00 |  49.0641271322966 |
      31 | 2017-01-10 19:30:00 |  60.9026057273149 | Brenner an
      32 | 2017-01-10 20:09:00 |  24.5222468301654 |
      33 | 2017-01-10 20:48:00 |  38.6401573568583 |
      34 | 2017-01-10 21:27:00 |  48.3621615543962 |
      35 | 2017-01-10 22:06:00 |  74.0922068431973 | Brenner an
      36 | 2017-01-10 22:45:00 |  71.332297809422 |
      37 | 2017-01-10 23:24:00 |  74.965793415904 | Brenner an
      38 | 2017-01-11 00:03:00 |  47.3292626813054 |
      39 | 2017-01-11 00:42:00 |  39.5431052520871 |
      40 | 2017-01-11 01:21:00 |  54.5231439545751 | Brenner an
      41 | 2017-01-11 02:00:00 |  4.0739943087101 |
      42 | 2017-01-11 02:39:00 |  79.9933699890971 | Brenner an
      43 | 2017-01-11 03:18:00 |  35.01041918993 |
      44 | 2017-01-11 03:57:00 |  72.7507422491908 | Brenner an
      45 | 2017-01-11 04:36:00 |  17.4377233162522 |
      46 | 2017-01-11 05:15:00 |  15.2867252379656 |
      47 | 2017-01-11 05:54:00 |  10.4527157172561 |
      48 | 2017-01-11 06:33:00 |  51.0669859871268 | Brenner an
      49 | 2017-01-11 07:12:00 |  38.2116141542792 |
      50 | 2017-01-11 07:51:00 |  8.87182261794806 |
    
    Ich habe sicherlich auch keine sonderlich sinnvollen Werte, weil ja via random() gewonnen. In Real dürfte das ja anders aussehen, oder?
     
  9. freehawk

    freehawk Benutzer

    hmm je länger ich gerade über meine Daten nachdenke werde ich es wohl in logik außerhalb lösen. Grund hierfür ist es dass die Werte ja auch schwanken. Ich bekomme gerade leider keinen Output meiner Daten.

    Also wenn der Brenner nicht läuft schwankt die Temperatur um einen gewissen Punkt. Da können alle möglichen Kombinationen von Werten auftauchen. Genauso wenn der Brenner läuft schwankt die Temperatur ebenso, da die Abgastemperatur auf einen gewissen Wert geregelt wird und deshalb schwankt.

    Dann kann ich sagen ich schaue mir die Daten an und wenn ein gewisser Wert überstiegen wird warte ich wieder bis ein gewisser Wert unterschritten wird. Das zähle ich dann als Brenner läuft...

    Denke das ist denke ich einfacher als hier eine sehr komplizierte Abfrage zu machen.
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Man könnte auch einen gleitenden Mittelwert berechnen, aber auch dazu benötigt man Window-Funktionen - die MySQL nicht bietet. Man ist halt immer wieder auf der Verliererseite mit MySQL ...
     
  11. freehawk

    freehawk Benutzer

    was wäre denn ein System was diese Funktionen alles abdeckt und dabei noch eine gute Integration in PHP bietet?
     
  12. akretschmer

    akretschmer Datenbank-Guru

    PostgreSQL.
     
  13. ukulele

    ukulele Datenbank-Guru

    Ist schon richtig das hier viele Funktionen die zur Lösung führen würden fehlen. Eine Zeilennummer könnte man auch verwenden um lag() zu emulieren.

    Wie wäre es denn mit soetwas wie:
    Code:
    SELECT   t.ID,
         t.zeit,
         t.wert,
         (   CASE
           WHEN   t.wert < 40
           THEN   'aus'
           WHEN   t.wert > 60
           THEN   'an'
           WHEN   t.wert BETWEEN 40 AND 60
           AND   (   SELECT   avg(wert)
               FROM   tabelle
               WHERE   zeit > t.zeit
               ORDER BY zeit DESC
               LIMIT 5 ) > 50
           THEN   'an'
           ELSE   'aus'
           END ) AS [status]
    FROM   tabelle t
    ORDER BY zeit DESC
    In diesem Fall nehme ich an das die Heitzung bei über 50 Grad an ist. Wenn die Temperatur zwischen 40 und 60 Grad liegt (Schwankungsbereich) wird geprüft, ob die 5 nachfolgenden Datensätze im Durchschnitt über 50 liegen, dann wird die Heitzung als aktiv betrachtet. Das läßt sich natürlich Feinjustieren.

    Der Subselect zieht etwas Performance.
     
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