2017-12-20 3 views
1

Ich habe eine Tabelle von Auto-IDs - id und deren Batteriestand - battery, die im Zehn-Minuten-Intervallen gesammelt werden.Mittlere Zeit, die zwischen den Aufzeichnungen

Mein Ziel ist die folgende Ausgabe: die durchschnittliche Zeit, die Batterien brauchen, um von 100 auf 0 zu fallen. Mein Ziel ist es, den globalen Mittelwert über alle Fahrzeug-IDs zu nehmen, dh die mittlere Zeitdifferenz zwischen battery = 100 und battery = 0 für alle eindeutigen IDs. Ein kleiner Vorbehalt ist, dass die 0 nach die 100 kommen muss, mit anderen Worten, ich möchte Ladezeiten ausschließen (wenn 100 nach einer 0 kämen).

Wie würde man eine solche Abfrage in psql schreiben?

ist hier eine Probe der Daten von einem Auto:

id|       time| battery 
54 | 2017-12-12 09:50:04.402775+00 |  100 
54 | 2017-12-12 09:40:04.618926+00 |  100 
54 | 2017-12-12 09:30:04.11399+00 |  100 
54 | 2017-12-12 09:20:03.906716+00 |  100 
54 | 2017-12-12 09:10:03.955133+00 |  100 
54 | 2017-12-12 09:00:04.678508+00 |  100 
54 | 2017-12-12 08:50:03.733471+00 |  100 
54 | 2017-12-12 08:40:03.65688+00 |  100 
54 | 2017-12-12 08:30:04.260608+00 |  100 
54 | 2017-12-12 08:20:03.98387+00 |  100 
54 | 2017-12-12 08:10:04.164129+00 |  98 
54 | 2017-12-12 08:00:04.597976+00 |  98 
54 | 2017-12-12 07:50:04.5|  98 
54 | 2017-12-12 07:40:04.441531+00 |  98 
54 | 2017-12-12 07:30:04.310876+00 |  98 
54 | 2017-12-12 07:20:04.317241+00 |  98 
54 | 2017-12-12 07:10:03.856432+00 |  67 
54 | 2017-12-12 07:00:03.628862+00 |  67 
54 | 2017-12-12 06:50:03.868495+00 |  67 
54 | 2017-12-12 06:40:04.490324+00 |  67 
54 | 2017-12-12 06:30:03.83739+00 |  67 
54 | 2017-12-12 06:20:03.817014+00 |  67 
54 | 2017-12-12 06:10:04.081174+00 |  29 
54 | 2017-12-12 06:00:04.178765+00 |  29 





    data_type   
-------------------------- 
integer 
timestamp with time zone 
integer 

Antwort

1

Also, Sie wollen nur die 100s, die eine 0 vor dem nächsten 100.

select avg(extract(epoch from (next_time - time)) as avg_recharge_time 
from (select t.*, 
      lead(battery) over (partition by id order by time) as next_battery, 
      lead(time) over (partition by id order by time) as next_time 
     from t 
     where battery in (0, 100) 
    ) t 
where battery = 100 and next_battery = 0; 

Dies beantwortet die Frage, die du hast gefragt. Jedoch. Ich kann mir vorstellen, dass deine Situation komplizierter ist. Wenn beispielsweise Batterien teilweise aufgeladen werden können, führt dies zu falschen Ergebnissen. Wenn Sie solche Situationen haben, fragen Sie eine andere Frage, mit geeigneten Beispieldaten und Erklärungen.

+0

Ja, das stimmt. Danke, dass du das notiert hast. Es ist möglich, sich teilweise aufzuladen, und daher sollten alle Fälle, in denen eine Erhöhung der Gebühr stattfindet, ausgeschlossen werden. Ich werde einen neuen Thread starten –

Verwandte Themen