2009-09-11 13 views
5

Ho una tabella che ha una certa colonna numerica chiamata Score. Vorrei eseguire una query su quella tabella, il cui risultato avrà 100 righe, ciascuna delle quali rappresenta il punteggio corrispondente a quel percentile. Ad esempio, il risultato può essere come segue:SQL: trovare percentili

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

I valori punteggio nella tabella dei risultati di cui sopra sono valori punteggio effettivo esistenti nella tabella originale, e non sono interpolati. Un risultato interpolato sarà migliore ma non è un requisito.

Possono esserci diverse euristiche che possono produrre un risultato simile. Quello che sto usando oggi (nel codice) è fondamentalmente il seguente: Il valore del punteggio corrispondente a un percentile sarà il valore del punteggio per il quale: il numero di righe con punteggi più piccoli, diviso per il numero totale di righe, arrotondato a un numero intero , pari al percentile (spero che sia chiaro)

posso prendere in considerazione altre euristiche se sono più facili da implementare

sto lavorando in MS-SQL, ma gradirebbe una soluzione che funziona anche su MySQL.

Qual è il modo migliore per raggiungere questo obiettivo?

+0

io non sono sicuro se è migliore per attuare questo all'interno di SQL sé. – Amber

+0

@Dav: non ne sono sicuro neanche io. Sto cercando di capire se è possibile in SQL, e quali sono le implicazioni sulle prestazioni. Con decine di milioni di record che non mantengo in memoria, forse SQL è il modo migliore. –

+0

@Dav: un altro punto: se ritieni che non sia adatto per SQL e puoi eseguire il backup utilizzando argomenti concreti, questa è una ** risposta valida ** è la mia opinione. –

risposta

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

Può essere utilizzato in modo simile su un server SQL2000? Il mio è solo 8.0.2055, quindi non riconosce ROW_NUMBER() o NTILE() per i principianti. – Cylindric

+0

funziona anche con PostgreSQL. Grazie. – bortzmeyer

Problemi correlati