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
:
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.
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%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.
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%Tags und Links algorithm linq-to-sql sql-server-2008 c#-4.0