2009-09-11 31 views
5

Tengo una tabla que tiene una cierta columna numérica llamada Score. Me gustaría ejecutar una consulta en esa tabla, cuyo resultado tendrá 100 filas, cada una representando el puntaje correspondiente con ese percentil. Por ejemplo, el resultado puede ser similar al siguiente:SQL: find percentiles

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

Los valores de puntuación en la tabla de resultados anteriores son valores de puntuación reales que existen en la tabla original, y no se interpolan. Un resultado interpolado será mejor, pero no es un requisito.

Puede haber varias heurísticas que puedan producir tal resultado. Lo que estoy usando hoy (en código) es básicamente el siguiente: el valor de puntaje correspondiente con un percentil será el valor de puntaje para el cual: el número de filas con puntajes más pequeños, dividido por el número total de filas, redondeado a un número entero , es igual al percentil (espero que eso está claro)

puedo considerar otras heurísticas si son más fáciles de implementar

estoy trabajando en MS-SQL, pero agradecería una solución que también trabaja en MySQL.

¿Cuál es la mejor manera de lograrlo?

+0

no estoy seguro de si lo mejor es poner en práctica esta dentro de sí mismo SQL. – Amber

+0

@Dav: Tampoco estoy seguro. Estoy tratando de entender si es posible en SQL, y cuáles son las implicaciones de rendimiento. Con decenas de millones de registros que no guardo en la memoria, tal vez SQL es la mejor manera. –

+0

@Dav: otro punto: si crees que no es adecuado para SQL, y puedes respaldarlo usando argumentos concretos, esa es una ** respuesta ** válida, es mi opinión. –

Respuesta

5

En 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

¿Se puede utilizar esto de manera similar en un servidor SQL2000? El mío es solo 8.0.2055, por lo que no reconoce ROW_NUMBER() o NTILE() para empezar. – Cylindric

+0

Funciona bien con PostgreSQL, también. Gracias. – bortzmeyer