Yo tengo un gran tabla de medición de datos en MySQL y necesito calcular el percentil para cada uno de estos valores. Oracle parece tener una función llamada percent_rank pero no puedo encontrar nada similar para MySQL. Estoy seguro de que podría sólo fuerza bruta en Python que puedo usar de todos modos para rellenar la tabla, pero sospecho que sería muy ineficiente debido a que una muestra puede tener 200.000 observaciones.
- ¿Puede por favor explicar exactamente a qué te refieres por percentil?
- en.wikipedia.org/wiki/Percentile_rank
- Hice una base de datos Mysql de la función de trabajo para cualquier percentil : stackoverflow.com/a/40266115/1662956
Este es un relativamente feo respuesta, y me siento culpable de decirlo. Dicho esto, puede ayudarle con su problema.
Una forma de determinar el porcentaje sería de contar todas las filas, y contar el número de filas que son mayores que la cantidad que usted proporcionó. Usted puede calcular ya sea mayor o menor que y tome la inversa como sea necesario.
Crear un índice en su número.
total = select count();
less_equal = select count (), donde el valor > indexed_number;
El porcentaje sería algo así como: less_equal /o total (total – less_equal)/total
Asegúrese de que ambos de ellos están utilizando el índice que ha creado. Si no lo son, ajustar hasta que se. El explicar consulta debe tener «uso de índice» en la columna de la derecha. En el caso de la select count(*) se debe utilizar el índice para InnoDB y algo como const para MyISAM. MyISAM se conoce este valor en cualquier momento sin tener que calcularlo.
Si usted necesita tener el porcentaje almacenados en la base de datos, puede utilizar el programa de instalación desde arriba de rendimiento y, a continuación, calcular el valor de cada fila por el uso de la segunda consulta como un select interno. La primera consulta del valor puede ser establecido como una constante.
Hace esta ayuda?
Jacob
Aquí es un enfoque diferente que no requiere de una combinación. En mi caso (una tabla con 15.000+) filas, se ejecuta en unos 3 segundos. (El método de combinación se lleva un orden de magnitud mayor).
En el ejemplo, suponga que medida es la columna en la que se está calculando el rango de porcentaje, y id es sólo un identificador de fila (no obligatorio):
De crédito para este método va a Shlomi Noaj. Escribe sobre ello en detalle aquí:
http://code.openark.org/blog/mysql/sql-ranking-without-self-join
He probado esta en MySQL y funciona muy bien; ninguna idea acerca de Oracle, SQLServer, etc.
no hay ninguna manera fácil de hacer esto. ver http://rpbouman.blogspot.com/2008/07/calculating-nth-percentile-in-mysql.html
Si usted es la combinación de SQL con un lenguaje procedimental como PHP, puede hacer lo siguiente. En este ejemplo se descompone el exceso de vuelo bloque veces en un aeropuerto, en sus percentiles. Utiliza el LÍMITE de x,y la cláusula en MySQL en combinación con
ORDER BY
. No muy bonito, pero hace el trabajo (lo siento luchado con el formato):MySQL 8 finalmente introdujo las funciones de la ventana, y entre ellos, el
PERCENT_RANK()
función que usted estaba buscando. Así, acaba de escribir:Su pregunta menciona «percentiles», que son un poco diferente de la cosa. La integridad de’ bien, hay
PERCENTILE_DISC
yPERCENTILE_CONT
inversa de la distribución de funciones en el estándar SQL y en algunos RBDMS (Oracle, PostgreSQL, SQL Server, Teradata), pero no en MySQL. Con MySQL 8 y las funciones de la ventana, usted puede emularPERCENTILE_DISC
, sin embargo, de nuevo utilizando elPERCENT_RANK
yFIRST_VALUE
las funciones de la ventana.Para obtener el rango, yo diría que usted necesita (a la izquierda) combinación externa de la tabla en sí mismo algo así como :
Para cada fila, el recuento de la cantidad (si alguna) de las filas de la misma tabla tienen un valor inferior.
Nota que estoy más familiarizado con sqlserver por lo que la sintaxis puede no ser adecuado. También las distintas pueden no tener el comportamiento correcto para lo que quieres lograr. Pero esa es la idea general.
A continuación, para obtener la verdadera percentil usted tendrá que obtener primero el número de valores de una variable (o valores distintos dependiendo de la convención usted quiere tomar) y calcular el percentil mediante el real clasificación dada anteriormente.
Supongamos que tenemos una tabla de ventas como :
user_id,unidades
a continuación, siguiente consulta dará percentil de cada usuario :
Tenga en cuenta que esto va a ir para la cruz de unirse por lo que el resultado en O(n2) complejidad, de modo que puede ser considerado como unoptimized solución, pero parece simple, dado que no tiene ninguna función en la versión de mysql.
No está seguro de lo que el op entiende por ‘percentil’, pero para obtener un determinado percentil de un conjunto de valores que ver http://rpbouman.blogspot.com/2008/07/calculating-nth-percentile-in-mysql.html
El sql de cálculo puede ser fácilmente modificada para producir otro o varios percentiles.
Una nota: he tenido que cambiar el cálculo ligeramente, por ejemplo, el percentil 90 – «90/100 * COUNT(*) + 0.5» en lugar de «90/100 * COUNT(*) + 1». A veces era saltarse dos valores de pasado el punto porcentual en la lista ordenada, en lugar de elegir el siguiente valor más alto para el percentil. Tal vez la manera entero de redondeo funciona en mysql.
es decir:
…. SUBSTRING_INDEX(SUBSTRING_INDEX( GROUP_CONCAT(fieldValue ORDEN POR fieldValue SEPARADOR ‘,’), ‘,’, 90/100 * CONTAR(*) + 0.5), ‘,’, -1) como 90thPercentile ….