Query - Abweichung vom Gruppendurchschnitt

Hallo,
ich hab ein Problem mit einer Abfrage, ich hoffe ihr könnt mir weiterhelfen:

Ich ermittle den Durchschnitt der Messwerte einer Testgruppe mit

select Testnummer, AVG(Varianzkoeffizient) AS AVGP
From  tabelle
Group bei Testnummer

soweit ja kein problem.

jetzt möchte ich prüfen, ob die Abweichung des Varianzkoeffizients eines Wertes vom Gruppendurchschnitt mehr als der Schwellwert X% beträgt.

(Die Werte mit Testnummer 14 haben zB einen AVG(Varianzkoeffizient) von 100, Varianzkoeffizient von Wert XY mit Testnummer 14 hat den Wert 105, Abweichung von 5% , was größer ist als der Schwellwert, also wird er ausgegeben.)

ich möchte also prüfen ob ein EINZELwert zu stark vom Gruppendurchschnitt einer Testnummer streut.

Bei google hab ich diesen Graph gefunden, so sähe im meinem Fall der Verlauf einer Testnummer aus :
http://www.ipsl.jussieu.fr/GLACIO/hoffmann/generalscience/GISSENSO_Page_2.jpg


Und da hörts mit meinem SQL-Kenntnissen schon auf :slight_smile:
Ich denke die Lösung ist relativ simpel, habe aber ewig rumprobiert und komme nicht drauf…

du solltest dir den unteren teil dieser seite genauer anschauen

(Liste von aggregat-funktionen) PostgreSQL: Documentation: Manuals: PostgreSQL 8.4: Aggregate Functions

um NACH der aggregation eine auswahl zu treffen kannst du die HAVING klausel verwenden …

also
SELECT …
FROM …
WHERE - bedingung vor der aggregation/gruppierung
GROUP BY …
HAVING - bedingung nach der aggregation/gruppierung

(kleines tutorial) PostgreSQL: Documentation: Manuals: PostgreSQL 8.4: Aggregate Functions

det ding ist, dass du in einem HAVING aggregat funktionen in deiner auswahl verwenden kannst, in einem WHERE hingegen nicht

hi,

vielen danke für denk link zur postgres doku :wink:
über having gehts in diesem fall nicht, hatte ich schon probiert…

habe in einem andren forum eine lösung gefunden, trotzdem danke für die antwort

ahhh … du brauchst window-functions … pg8.4 required … du willst die elemente ausgeben - also die varianz-koeffizienten … ohne zu gruppieren

oder du nutzt eine subquery in der du die bedingung feststellst

die lösung ist mit subquery, denke das ist ok wenn ich die mal hier poste falls es wen intressiert:


SELECT *
FROM #Dummy
WHERE Wert >= 5 + (SELECT AVG(Wert) 
                           FROM #Dummy AS SUB 
                           WHERE SUB.Id = #Dummy.Id)