Question

J'ai une table de données simple, et je voudrais sélectionner la ligne qui est au sujet du 40 e percentile de la requête.

Je peux le faire dès maintenant en interrogeant d'abord de trouver le nombre de lignes, puis une autre requête en cours d'exécution qui trie et sélectionne la nième ligne:

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

qui peut retourner quelque chose comme 93, 93 * 0,4 = 37

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

Puis-je combiner ces deux requêtes en une seule requête?

Était-ce utile?

La solution

Cela vous donnera approximativement le 40e percentile, il retourne la ligne où 40% des lignes sont moins que lui. Il trie les lignes par la façon dont ils sont loin du percentile 40e, car aucune ligne peut tomber exactement sur le percentile 40e.

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

Autres conseils

Comme un exercice futile (votre soliton actuelle serait probablement plus rapide et preféré), si la table est MyISAM (ou vous pouvez vivre avec le rapprochement des 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';

Il y a aussi cette solution , qui utilise une chaîne de monstre faite par GROUP_CONCAT. Je devais le maximum sur la sortie comme si pour l'obtenir au travail:

SET SESSION group_concat_max_len = 1000000;

MySql magiciens là. Ne hésitez pas à commenter la performance relative des méthodes

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top