2009-09-11 13 views
5

Ich habe eine Tabelle, die eine bestimmte numerische Spalte namens Score hat. Ich möchte eine Abfrage für diese Tabelle ausführen, deren Ergebnis 100 Zeilen haben wird, von denen jede die Punktzahl darstellt, die diesem Perzentil entspricht. Zum Beispiel kann ein Ergebnis kann wie folgt aussehen:SQL: Perzentil finden

Percentile | Score 
--------------------- 
01   | 10 
02   | 12 
03   | 12 
04   | 17 
...  | ... 
99   | 1684 
100  | 1685 

Die Score-Werte in der Ergebnistabelle oben sind die tatsächlichen Score-Werte, die in der ursprünglichen Tabelle vorhanden ist, und werden nicht interpoliert. Ein interpoliertes Ergebnis wird besser sein, ist aber keine Voraussetzung.

Es kann mehrere Heuristiken geben, die ein solches Ergebnis erzeugen können. Was ich heute (im Code) benutze, ist im Prinzip wie folgt: Der Score-Wert, der einem Perzentil entspricht, ist der Score-Wert, für den: die Anzahl der Zeilen mit kleineren Scores geteilt durch die Gesamtzahl der Zeilen auf eine ganze Zahl gerundet wird , entspricht den Perzentil (ich hoffe, dass klar ist)

ich andere Heuristik betrachten kann, wenn sie leichter sind

ich in MS-SQL zu implementieren gerade arbeitete, würde aber eine Lösung zu schätzen wissen, die auch auf MySQL arbeitet.

Was ist der beste Weg, dies zu erreichen?

+0

Ich bin mir nicht sicher, ob es am besten ist, diese selbst in SQL zu implementieren. – Amber

+0

@Dav: Ich bin mir auch nicht sicher. Ich versuche zu verstehen, ob dies in SQL möglich ist und welche Auswirkungen dies auf die Leistung hat. Mit Dutzenden von Millionen von Datensätzen, die ich nicht im Speicher habe - vielleicht ist SQL der beste Weg. –

+0

@Dav: ein anderer Punkt - wenn Sie denken, dass es nicht für SQL geeignet ist, und Sie können dies mit konkreten Argumenten unterstützen, das ist eine gültige ** Antwort ** ist meine Meinung. –

Antwort

5

In SQL Server:

SELECT percentile, score 
FROM (
     SELECT ROW_NUMBER() OVER (PARTITION BY percentile ORDER BY score) AS rn, percentile, score 
     FROM (
       SELECT score, NTILE(100) OVER (ORDER BY score) AS percentile 
       FROM mytable 
       ) q 
     ) q2 
WHERE rn = 1 
+0

Kann dies in ähnlicher Weise auf einem SQL2000-Server verwendet werden? Meine ist nur 8.0.2055, also erkennt ROW_NUMBER() oder NTILE() für Starter nicht. – Cylindric

+0

Funktioniert auch gut mit PostgreSQL. Vielen Dank. – bortzmeyer

Verwandte Themen