2012-08-10 14 views
5

ho una colonna di dati, alcuni dei quali sono valori NULL, da cui desidera estrarre il singolo 90 ° percentile valore:T-SQL: Calcolo del Ennesimo percentile valore da colonna

ColA 
----- 
NULL 
100 
200 
300 
NULL 
400 
500 
600 
700 
800 
900 
1000 

Per Quanto sopra, sto cercando una tecnica che restituisca il valore 900 quando si cerca il 90 ° percentile, 800 per l'80 ° percentile, ecc. Una funzione analoga sarebbe AVG (ColA) che restituisce 550 per i dati sopra indicati, o MIN (ColA)) che restituisce 100, ecc.

Qualche suggerimento?

+0

Avrai sempre 10 valori non nulli? – Paparazzi

risposta

9

Se si desidera ottenere esattamente il valore del 90 ° percentile, esclusi i valori NULL, suggerirei di eseguire direttamente il calcolo. La seguente versione calcola il numero di riga e il numero di righe, e seleziona il valore appropriato:

select max(case when rownum*1.0/numrows <= 0.9 then colA end) as percentile_90th 
from (select colA, 
      row_number() over (order by colA) as rownum, 
      count(*) over (partition by NULL) as numrows 
     from t 
     where colA is not null 
    ) t 

ho messo la condizione nella clausola SELECT piuttosto che la clausola WHERE, in modo da poter facilmente raggiungere il 50 ° percentile, 17 °, o qualunque valore tu voglia.

+0

Se l'op sta cercando un solo valore per essere il 90 ° percritile, non dovrebbe essere né il valore medio o mediano di tutti i 90 ° petcentile? Di ', posizione 90,5 invece di posizione 90.0? – MatBailie

+0

@Dems ... Non esattamente. In generale, la divisione sarebbe esattamente il valore al 90%, se esiste. In secondo luogo, è tradizionalmente considerato come la media del valore immediatamente prima e immediatamente dopo. Penso che la media della 90esima piastrella sia più vicina a quello che stai pensando. Un calcolo valido, ma non quello che dovremmo chiamare il 90 ° percentile. Potrebbe esserci un chiaro disaccordo su cosa fare con i valori duplicati, poiché lo stesso valore potrebbe essere l'80 ° percentile e il 90 ° (in entrambi i calcoli). –

+0

Scuse per il ritardo "accetta"! La tua era la risposta che ho usato, Gordon. Grazie ancora. – jbeldock

4
WITH 
    percentiles AS 
(
    SELECT 
    NTILE(100) OVER (ORDER BY ColA) AS percentile, 
    * 
    FROM 
    data 
) 
SELECT 
    * 
FROM 
    percentiles 
WHERE 
    percentile = 90 


Nota: se i dati sono meno di 100 osservazioni, non tutti i percentili avranno un valore. Allo stesso modo, se avete più di 100 osservazioni, alcuni percentili conterranno più valori.

+0

+1 per 'NTILE'. Nota che se ci sono meno di 100 valori, diciamo solo 50 valori ... allora il percentile sarà '1 - 50' ... quindi ci sarà solo un 90 percentile se ci sono più di 90 valori. –

+0

Grazie. Questo è un passo nella giusta direzione. Sto modificando il mio post per indicare altri due requisiti: i dati contengono molti NULL e dovrebbero essere ignorati e il mio obiettivo è quello di ricavare un singolo valore (** il ** 90 ° percentile). – jbeldock

Problemi correlati