Pregunta

Tengo una tabla sencilla de los datos, y me gustaría para seleccionar la fila que está en aproximadamente el 40 percentil de la consulta.

Me puede hacer esto ahora por primera consulta para encontrar el número de filas y luego ejecuta otra consulta que clasifica y selecciona la fila n:

select count(*) as `total` from mydata;

que puede devolver algo como 93, 93 * 0,4 = 37

select * from mydata order by `field` asc limit 37,1;

¿Puedo combinar estas dos consultas en una sola consulta?

¿Fue útil?

Solución

Esto le dará aproximadamente el percentil 40, devuelve la fila donde el 40% de las filas son menos que él. Se ordena las filas de lo lejos que están del percentil 40, ya que ninguna fila puede caer exactamente en el percentil 40.

SELECT m1.field, m1.otherfield, count(m2.field) 
  FROM mydata m1 INNER JOIN mydata m2 ON m2.field<m1.field
GROUP BY 
   m1.field,m1.otherfield
ORDER BY 
   ABS(0.4-(count(m2.field)/(select count(*) from mydata)))
LIMIT 1

Otros consejos

Como un ejercicio de futilidad (solition su actual probablemente sería más rápido y preferidas), si la tabla es MYISAM (o se puede vivir con la aproximación de InnoDB):

SET @row =0;
SELECT x.*
FROM information_schema.tables
JOIN (
  SELECT @row := @row+1 as 'row',mydata.*
  FROM mydata
  ORDER BY field ASC
) x
ON x.row = round(information_schema.tables.table_rows * 0.4)
WHERE information_schema.tables.table_schema = database()
AND information_schema.tables.table_name = 'mydata';

También hay esta solución , que utiliza una cadena monstruo hecho por GROUP_CONCAT. Tenía que el máximo de la salida es similar a conseguir que funcione:

SET SESSION group_concat_max_len = 1000000;

MySql magos por ahí:. Siéntase libre de comentar sobre el rendimiento relativo de los métodos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top