Abfrage mit komplexer Berechnung

icrazy

Benutzer
Beiträge
5
Hallo,

ich habe eine Abfrage erstellt, aus dieser Abfrage möchte ich eine View erstellen mit komplexer Formel.

Ergebnis der Abfrage sind Werte von 100-0. Es sind insgesamt 30 Werte.

Von den 30 Werten solle er den Mittelwert der Senkung der Werte ermitteln. Aber nur, wenn die Zahl unter 100 ist. Sobald 100 ist, soll er die Berechnung bis dahin ausführen, und dann abbrechen.

Beispiel:

Wert1; Wert2; Wert3; Wert4; Wert5; Wert6; Wert7; Wert8; Wert9, Wert10
30; 34; 37; 40;50;51;52;56;70;75

Er soll dann im Prinzip die Differenz der jeweiligen Zahlen berechnen und daraus den Mittelwert.
Also
Mittelwert aus (Wert2-Wert1) und (Wert3-Wert2)....

Wenn aber in den Werten eine 100 vorkommt, dann soll er die Berechnung nur bis dahin ausführen.

Wie sieht hier die Formel aus? In Excel bekomme ich das ganz einfach hin. Aber da es eine komplexe Tabelle ist, ist es sehr langsam..

Danke
 
Werbung:
Knifflig ...

Code:
test=*# select * from icrazy ;
 w1 | w2 | w3 | w4 | w5 | w6 | w7 | w8 | w9 | w10
----+----+----+----+----+----+----+----+----+-----
 30 | 34 | 37 | 40 | 50 | 51 | 52 | 56 | 70 |  75
(1 Zeile)

test=*# select avg(bla) from (select regexp_split_to_table(array_to_string(foo,','),',')::int bla from (select array[w2-w1,w3-w2,w4-w3,w5-w4,w6-w5,w7-w7,w8-w7,w9-w8,w10-w9] foo from icrazy) x) blub;
  avg   
--------------------
 4.8888888888888889
(1 Zeile)

test=*#

wie (bei mir) üblich mit PostgreSQL gemacht.
 
Ich denke mal, das Tabellendesign ist Murks. Das sind ja offenbar irgendwie Messwerte, die nacheinander anfallen. Wenn Du das in eine Tabelle mit Zeitpunkt und Messwert tust und jede einzelne Messung dann eine Zeile ergibt, kannst Du dann via Window-Funktionen sehr viel einfacher rechnen. Und Du hast auch keine Probleme, wenn vielleicht mal 31 oder 42 Messwerte anfallen.
 
Die Die Werte zeigen Prozentwerte an, Wert 1 von heute, Wert2 von gestern usw...
D.h. das Ergebnis sind Prozentwerte von Maschinen. Pro Maschine gibt es eine Zeile mit den Werten
 
Das ist in der Tat suboptimal und viel Aufwendiger als irgendwie einmal am Tag eine Zeile mit Datum und Messwert zu schreiben. Mehr Spalten bedeutet mehr manuelle Frickelei.

Wenn du aber von jeder Maschine jeden Tag 30 Werte bekommst, hast du dann nicht Redundanzen und bildet nicht der Wert1 der letzten 30 Zeilen dann genau das ab was die letzte Zeile in 30 Spalten tut? Wenn dem so wäre könnte man nur mit Wert1 arbeiten.
 
Ich muss ja aus den Werten die Sekungsrate herausfinden. Nicht den letzten Wert. Worum geht es?
Ich muss berechnen, wann der Wert 0% erreicht wird.
 
wie schon gesagt, Dein Table-Design ist offenbar Murks.

Code:
test=# create table icrazy(datum date, wert int);
CREATE TABLE
test=# insert into icrazy values (current_date-0, 30);
INSERT 0 1
test=# insert into icrazy values (current_date-1, 34);
INSERT 0 1
test=# insert into icrazy values (current_date-2, 37);
INSERT 0 1
test=# insert into icrazy values (current_date-3, 40);
INSERT 0 1
test=# insert into icrazy values (current_date-4, 50);
INSERT 0 1
test=# insert into icrazy values (current_date-5, 51);
INSERT 0 1
test=# insert into icrazy values (current_date-6, 55);
INSERT 0 1
test=# insert into icrazy values (current_date-7, 56);
INSERT 0 1
test=# insert into icrazy values (current_date-8, 570);
INSERT 0 1
test=# insert into icrazy values (current_date-9, 75);
INSERT 0 1
test=# update icrazy set wert=70 where wert=570;
UPDATE 1
test=# select datum, wert from icrazy order by datum desc;
  datum  | wert
------------+------
 2017-05-31 |  30
 2017-05-30 |  34
 2017-05-29 |  37
 2017-05-28 |  40
 2017-05-27 |  50
 2017-05-26 |  51
 2017-05-25 |  55
 2017-05-24 |  56
 2017-05-23 |  70
 2017-05-22 |  75
(10 rows)

test=# select datum, wert, lead(wert) over (order by datum desc) - wert as senkung from icrazy order by datum desc;
  datum  | wert | senkung
------------+------+---------
 2017-05-31 |  30 |  4
 2017-05-30 |  34 |  3
 2017-05-29 |  37 |  3
 2017-05-28 |  40 |  10
 2017-05-27 |  50 |  1
 2017-05-26 |  51 |  4
 2017-05-25 |  55 |  1
 2017-05-24 |  56 |  14
 2017-05-23 |  70 |  5
 2017-05-22 |  75 |   
(10 rows)

test=#


Mal so als Ansatz.
 
Darauf wollte ich hinaus, so könnte man es für beliebige Zeiträume ermittel. Zur Not kannst du es mit PIVOT auch im letzten Schritt noch "vertikal" anordnen, aber visualisierung der Information ist ja eigentlich Aufgabe der Aplikation, nicht der DB.
 
Ich versteh nicht euer Problem. Ihr macht euch Gedanken um Dinge um die es gar nicht geht.
Ich habe klar und deutlich geschrieben, was ich brauche. Und was ich habe. Und ihr diskutiert um was worum es nicht geht. Wenn ihr es nicht wisst was zu machen ist mit meiner Tabelle, dann antwortet einfach nicht, aber schreibt nicht über angeblichen Murks...

Wert 1 ist immer der Wert von heute usw...
 
Werbung:
Ich versteh nicht euer Problem. Ihr macht euch Gedanken um Dinge um die es gar nicht geht.

Schnuki, es geht hier darum, Dir zu helfen. Dazu gehört auch, das wir es sagen, wenn wir tiefergehende Probleme sehen. Sehe es als kostenfreie Dienstleistung, nicht als Gängelei. Dafür zahlen unsere Kunde teilweise viel Geld - hier bekommst Du es kostenfrei.
 
Zurück
Oben