2017-06-27 4 views
0

Das Ziel ist es, extrem kleine oder große Datensätze für jedes Band basierend auf einer Formel zu finden.Ausreißer zu jedem Band von Datensätzen finden

Eingang:

Distance Rate 
10  5 
25  200 
50  300 
1000  5 
2000  2000 

Bands werden durch meine Eingabe definiert. Zum Beispiel möchte ich zwei Bänder für diesen Eingang haben (tatsächlich gibt es mehr, wie 10 Bänder) für die Entfernung: 1-100, 101-10000.

Für jedes Band wollen wir alle Datensätze finden, die die Raten Ausreißer durch Formel f (von mittleren zwei Standardabweichungen entfernt, wenn Sie in der Formel interessiert sind)

Die Formel f I

verwenden möchten

(Rate- avg(Rate) over())/(stddev(Rate) over()) > 2

Ausgang:

Distance Rate 
10  5 
1000  5 (this number is for illustrative purpose only.) 

Der schwierige Teil ist I d Ich weiß nicht, wie man es für jede Band macht, und es macht die Anwendung der Formel schwieriger.

+0

Was ist eine "Band der Aufzeichnungen"? Und welcher Teil des Problems ist ein Problem? Eine Beispielabfrage würde wirklich helfen. Wie weisen Sie zum Beispiel die Bänder zu? –

+0

@GordonLinoff Ich interpretiere es als eine Gruppe von Zeilen mit einer bestimmten Spalte Wert passt in einen beliebigen Bereich. –

+0

@TabAlleman Ja. Lassen Sie mich mehr Erklärungen in die Frage bringen. –

Antwort

0

Ohne zu wissen, wie Sie Ihre Formel anzuwenden (meine Vermutung wäre, UDF), können Sie Ihren „Bänder“ durch die Gruppierung von einem CASE-Ausdruck erstellen:

GROUP BY CASE 
    WHEN Distance BETWEEN 1 AND 100 THEN 'Band1' 
    WHEN Distance BETWEEN 101 AND 10000 THEN 'Band2' 
    ETC 
END 

ähnlich verwenden Sie den gleichen CASE-Ausdruck in eine RANK() OVER() -Funktion, wenn das für den Rest Ihrer Anfrage besser funktioniert.

EDIT: basierend auf Ihrer Klarstellung, müssen Sie dies mit einer korrelierten Sub-Abfrage in Ihrer WHERE-Klausel behandeln. Ich würde es in eine UDF einkapseln, um die Hauptabfrage sauberer aussehen zu lassen. Etwas wie:

WHERE (Rate- {Correlated query to select the AVG(rate) of all rows in this band (using the above CASE statement to determine "this band"} over())/(stddev(Rate) over()) > 2 
+0

Ich habe weitere Informationen über die Formel hinzufügen. Könnten Sie einen Blick darauf werfen? –

Verwandte Themen