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

Abfrage mit komplexer Berechnung

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von icrazy, 30 Mai 2017.

  1. icrazy

    icrazy Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  3. akretschmer

    akretschmer Datenbank-Guru

    Das verkompliziert das SQL nur unwesentlich ;-)
     
  4. icrazy

    icrazy Benutzer

    Vielen Dank vorerst. Kann es sein, dass dies mit Mssql nicht geht?
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Ja, das kann sein.
     
  6. ukulele

    ukulele Datenbank-Guru

    Ich verstehe schon die Aufgabe nicht, sind Wert1 bis Wert10 bzw. Wert30 jetzt Splaten oder Zeilen?
     
  7. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  8. icrazy

    icrazy Benutzer

    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
     
  9. akretschmer

    akretschmer Datenbank-Guru

    Ja. Heute ist Wert2 von gestern und Morgen? Das ist Murks.
     
  10. ukulele

    ukulele Datenbank-Guru

    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.
     
    Walter gefällt das.
  11. icrazy

    icrazy Benutzer

    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.
     
  12. akretschmer

    akretschmer Datenbank-Guru

    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.
     
    ukulele und Walter gefällt das.
  13. ukulele

    ukulele Datenbank-Guru

    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.
     
  14. icrazy

    icrazy Benutzer

    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...
     
  15. akretschmer

    akretschmer Datenbank-Guru

    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.
     
    Ouvert gefällt das.
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