Wählen Sie verschiedene Gruppen von Zeilen nach dem Durchschnitt

8

Ich habe die Tabelle t_stats mit der Spalte id (INT) und der Spalte ratio (DECIMAL(8,4)) . id ist einzigartig.

Ich möchte die Tabelle t_stats abfragen, um 3 Gruppen mit der gleichen AVG(ratio) (möglichst klein) auszuwählen.

Kann mit temporären Tabellen gemacht werden, solange ich es als Skript oder gespeicherte Prozedur ausführen kann.

EDIT: Hier ist das konkrete Beispiel:

EINGABE:

%Vor%

AUSGABE:

%Vor%

Ich möchte also 3 Gruppen von n -Werten erstellen und auf einen bestimmten Durchschnittswert x abzielen. (Beispiel mit n=30 und 0.75 < x < 0.85 würde wie 3 Gruppen mit jeweils 30 Werten aussehen, wobei jede Gruppe 0.75 < AVG(ratio) < 0.85 und ein id nur zu 1 Gruppe gehören kann.)

So ist der Durchschnitt in jeder Gruppe fast gleich und nahe bei x :

%Vor%     
Francis P 12.10.2012, 20:07
quelle

4 Antworten

3

Hier ist eine prozedurale T-SQL-Version, die etwas wie ein Entwurf ist, nur der Draft-Auftrag ist optimiert jede Runde nach Bedarf.

Die "kompetitive" Natur scheint zu etwas weniger als perfekten Verhältnissen zu führen, wenn alle Punkte ausgewählt werden sollen, aber die bessere Seite ist, dass Sie grundsätzlich einen O (N ^ 2) Algorithmus haben, da es im Wesentlichen ein min ist Funktion in einer Schleife (vielleicht ist das optimistisch in Anbetracht der group by -Klauseln). Es ist auch deterministisch und sollte bei Bedarf relativ einfach in eine andere Ebene implementiert werden können.

%Vor%     
Tim Lehner 18.10.2012, 20:44
quelle
2

Versuchen Sie es

%Vor%

Ergebnis

Bearbeitet Ich habe versucht, mit den Sample-Daten, die Sie zur Verfügung gestellt (ddl als Referenz angegeben)

%Vor%

Und das Ergebnis ist

Die Ausführungszeit beträgt 27 Sekunden. Bitte testen Sie von Ihrem Ende (auch das Ergebnis) und lassen Sie es mich wissen.

Bearbeitet

75 DDL aufnehmen

%Vor%     
Niladri Biswas 13.10.2012 08:20
quelle
1

SQL ist wirklich nicht das beste Werkzeug für diese Art von Problem.

Aber manchmal macht es Spaß, ein paar Schrauben mit dem TSQL-Hammer zu schlagen !!

Hier ist ein Aufwand, der die folgenden 75 Zeilen Beispieldaten enthält:

%Vor%

In einer Sekunde auf meiner Maschine.
Nur eine Einschränkung: Diese Methode hat massive Fehler, aber wenn Sie dies in SQL tun müssen, können Sie wahrscheinlich etwas über sie gaffer, ich hatte einfach keine Zeit zu.

%Vor%     
Peter Wishart 18.10.2012 01:07
quelle
0

Oh, und wenn die Anzahl der Elemente in einer Gruppe eine genaue Anforderung ist, ist hier eine Version, die die gleiche erschöpfende Übereinstimmung für das Box-Packing-Teil verwendet, aber es ist viel langsamer.

%Vor%     
Peter Wishart 18.10.2012 17:38
quelle