negative Flanken erkennen, zählen und berechnen

Manni

Neuer Benutzer
Beiträge
1
Hallo zusammen.
Habe folgendes Problem:
Ich habe von einer laufenden Anlage einen ganzen Tag lang Daten mitgeschrieben und in eine Datenbank importiert. Die Anlage läuft den ganzen Tag über mehrfach an und bleibt stehen (Wechsel von 1-Signal auf 0-Signal). Außerdem zeichnen wir die Geschwindigkeit auf.
Nun wollen wir eine Aufzeichnung darüber haben, wie lange das Gerät zum tatsächlichen stehenbleiben benötigt (Bremszeit bzw. Nachlaufzeit, also die Zeit die das Gerät benötigt wenn das Gerät 0-Signal[negative Flanke] bekommt, bis die tatsächliche Geschwindigkeit auch gleich null ist).
Im Anhang ist die Tabelle, ich will nun die Zeit des blau markierten Bereichs ermitteln. Und dies möglichst mit einer Formel, da dieser Bremsvorgang mehrere hundert mal am Tag stattfindet.

mit freundlichen Grüßen
Manni

 

Anhänge

  • Forum.PNG
    Forum.PNG
    52,4 KB · Aufrufe: 3
Werbung:
Hrm. Window-Funktionen im Einsatz, und PostgreSQL:

Testdaten, flag ist hier deine Spalte mit 0 oder 1:

Code:
test=*# select * from speed order by id;
 id  |  ts  |  speed  | flag
-----+----------------------------+-------------------+------
  99 | 2017-05-05 10:50:57.478298 |  10 |  1
 100 | 2017-05-05 10:51:57.478298 |  10 |  1
 101 | 2017-05-05 10:52:57.478298 |  10 |  1
 102 | 2017-05-05 10:52:57.977369 |  9.62958489311859 |  0
 103 | 2017-05-05 10:53:07.825635 |  9.44337836047634 |  0
 104 | 2017-05-05 10:53:12.495982 |  8.97695151576772 |  0
 105 | 2017-05-05 10:53:18.298975 |  8.71800468349829 |  0
 106 | 2017-05-05 10:53:23.671053 |  8.6518549574539 |  0
 107 | 2017-05-05 10:53:24.349488 |  8.50251144077628 |  0
 108 | 2017-05-05 10:53:28.571231 |  8.10751779563724 |  0
 109 | 2017-05-05 10:53:32.786024 |  7.89821347501128 |  0
 110 | 2017-05-05 10:53:33.995941 |  7.73598881997167 |  0
 111 | 2017-05-05 10:53:41.280964 |  7.58567395783028 |  0
 112 | 2017-05-05 10:53:42.807535 |  7.29916237154974 |  0
 113 | 2017-05-05 10:53:50.437909 |  7.26726401201448 |  0
 114 | 2017-05-05 10:53:59.972147 |  6.98797417851164 |  0
 115 | 2017-05-05 10:54:03.527661 |  6.75272749969735 |  0
 116 | 2017-05-05 10:54:08.580945 |  6.43284459854475 |  0
 117 | 2017-05-05 10:54:12.287562 |  6.15522681712172 |  0
 118 | 2017-05-05 10:54:16.093522 |  5.97748265974223 |  0
 119 | 2017-05-05 10:54:25.370008 |  5.55366729549132 |  0
 120 | 2017-05-05 10:54:28.253428 |  5.29969331808388 |  0
 121 | 2017-05-05 10:54:31.908672 |  4.88691843044944 |  0
 122 | 2017-05-05 10:54:38.311146 |  4.67023447202518 |  0
 123 | 2017-05-05 10:54:39.553514 |  4.63902359874918 |  0
 124 | 2017-05-05 10:54:41.787066 |  4.36616555205545 |  0
 125 | 2017-05-05 10:54:46.59737  |  4.19399209180845 |  0
 126 | 2017-05-05 10:54:55.299024 |  4.08922572783193 |  0
 127 | 2017-05-05 10:55:01.74879  |  4.07781447120941 |  0
 128 | 2017-05-05 10:55:09.574349 |  3.71060186917892 |  0
 129 | 2017-05-05 10:55:10.440541 |  3.04822015133685 |  0
 130 | 2017-05-05 10:55:20.106478 |  2.65026658959685 |  0
 131 | 2017-05-05 10:55:22.171208 |  2.22553670038467 |  0
 132 | 2017-05-05 10:55:22.990572 |  1.70611539157105 |  0
 133 | 2017-05-05 10:55:23.262149 |  1.28983619287608 |  0
 134 | 2017-05-05 10:55:32.58838  | 0.430510531365851 |  0
 135 | 2017-05-05 10:55:35.690012 |  0.23164193551054 |  0
 136 | 2017-05-05 10:55:40.317554 |  0 |  0
 137 | 2017-05-05 10:56:57.478298 |  0 |  0
 138 | 2017-05-05 10:57:57.478298 |  0 |  0
(40 Zeilen)

Du suchst offenbar alle die, die nachfolgend valid=1 sind:

Code:
test=*# select *, case when lead(flag) over(order by id) = 0 and speed > 0 or lag(flag) over (order by id) = 0 and lag(speed) over (order by id) > 0 then 1 else 0 end as valid from speed order by id;
 id  |  ts  |  speed  | flag | valid
-----+----------------------------+-------------------+------+-------
  99 | 2017-05-05 10:50:57.478298 |  10 |  1 |  0
 100 | 2017-05-05 10:51:57.478298 |  10 |  1 |  0
 101 | 2017-05-05 10:52:57.478298 |  10 |  1 |  1
 102 | 2017-05-05 10:52:57.977369 |  9.62958489311859 |  0 |  1
 103 | 2017-05-05 10:53:07.825635 |  9.44337836047634 |  0 |  1
 104 | 2017-05-05 10:53:12.495982 |  8.97695151576772 |  0 |  1
 105 | 2017-05-05 10:53:18.298975 |  8.71800468349829 |  0 |  1
 106 | 2017-05-05 10:53:23.671053 |  8.6518549574539 |  0 |  1
 107 | 2017-05-05 10:53:24.349488 |  8.50251144077628 |  0 |  1
 108 | 2017-05-05 10:53:28.571231 |  8.10751779563724 |  0 |  1
 109 | 2017-05-05 10:53:32.786024 |  7.89821347501128 |  0 |  1
 110 | 2017-05-05 10:53:33.995941 |  7.73598881997167 |  0 |  1
 111 | 2017-05-05 10:53:41.280964 |  7.58567395783028 |  0 |  1
 112 | 2017-05-05 10:53:42.807535 |  7.29916237154974 |  0 |  1
 113 | 2017-05-05 10:53:50.437909 |  7.26726401201448 |  0 |  1
 114 | 2017-05-05 10:53:59.972147 |  6.98797417851164 |  0 |  1
 115 | 2017-05-05 10:54:03.527661 |  6.75272749969735 |  0 |  1
 116 | 2017-05-05 10:54:08.580945 |  6.43284459854475 |  0 |  1
 117 | 2017-05-05 10:54:12.287562 |  6.15522681712172 |  0 |  1
 118 | 2017-05-05 10:54:16.093522 |  5.97748265974223 |  0 |  1
 119 | 2017-05-05 10:54:25.370008 |  5.55366729549132 |  0 |  1
 120 | 2017-05-05 10:54:28.253428 |  5.29969331808388 |  0 |  1
 121 | 2017-05-05 10:54:31.908672 |  4.88691843044944 |  0 |  1
 122 | 2017-05-05 10:54:38.311146 |  4.67023447202518 |  0 |  1
 123 | 2017-05-05 10:54:39.553514 |  4.63902359874918 |  0 |  1
 124 | 2017-05-05 10:54:41.787066 |  4.36616555205545 |  0 |  1
 125 | 2017-05-05 10:54:46.59737  |  4.19399209180845 |  0 |  1
 126 | 2017-05-05 10:54:55.299024 |  4.08922572783193 |  0 |  1
 127 | 2017-05-05 10:55:01.74879  |  4.07781447120941 |  0 |  1
 128 | 2017-05-05 10:55:09.574349 |  3.71060186917892 |  0 |  1
 129 | 2017-05-05 10:55:10.440541 |  3.04822015133685 |  0 |  1
 130 | 2017-05-05 10:55:20.106478 |  2.65026658959685 |  0 |  1
 131 | 2017-05-05 10:55:22.171208 |  2.22553670038467 |  0 |  1
 132 | 2017-05-05 10:55:22.990572 |  1.70611539157105 |  0 |  1
 133 | 2017-05-05 10:55:23.262149 |  1.28983619287608 |  0 |  1
 134 | 2017-05-05 10:55:32.58838  | 0.430510531365851 |  0 |  1
 135 | 2017-05-05 10:55:35.690012 |  0.23164193551054 |  0 |  1
 136 | 2017-05-05 10:55:40.317554 |  0 |  0 |  1
 137 | 2017-05-05 10:56:57.478298 |  0 |  0 |  0
 138 | 2017-05-05 10:57:57.478298 |  0 |  0 |  0
(40 Zeilen)

test=*#

Und nun rechnen wir das zusammen:

Code:
test=*# select max(ts), min(ts), max(ts)-min(ts) as dauer from (select *, case when lead(flag) over(order by id) = 0 and speed > 0 or lag(flag) over (order by id) = 0 and lag(speed) over (order by id) > 0 then 1 else 0 end as valid from speed order by id) foo where valid = 1;
  max  |  min  |  dauer   
----------------------------+----------------------------+-----------------
 2017-05-05 10:55:40.317554 | 2017-05-05 10:52:57.478298 | 00:02:42.839256
(1 Zeile)

test=*#
 
Werbung:
Ich fürchte da ist Access nicht das beste Werkzeug, PostgreSQL, MSSQL oder Oracle wären wohl besser geeignet. Zumal da ja ne ganze Menge Datensätze zusammen kommen wenn man das mal ein Jahr laufen läßt.
 
Zurück
Oben