Frage

Ich habe eine einfache Tabelle mit Daten, und ich möchte die Zeile, dass die etwa in der 40. Perzentile aus der Abfrage wählen.

Das kann ich jetzt durch die erste Abfrage die Anzahl der Zeilen zu finden und dann läuft eine weitere Abfrage, dass Art und wählt die n-te Zeile:

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

, die so etwas wie 93 zurückkehren können, 93 * 0,4 = 37

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

Kann ich kombinieren diese beiden Abfragen in einer einzigen Abfrage?

War es hilfreich?

Lösung

Dies wird Ihnen etwa der 40. Perzentile, es gibt die Zeile, in der 40% der Zeilen kleiner sind als sie. Er sortiert Zeilen durch, wie weit sie von der 40. Perzentile sind, da keine Zeile auf der 40. Perzentile genau fallen kann.

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

Andere Tipps

Als Übung in Vergeblichkeit (Ihre aktuelle solition wahrscheinlich schneller und lieber wäre), wenn die Tabelle MYISAM ist (oder Sie können mit der Annäherung von InnoDB leben):

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';

Es gibt auch diese Lösung, die ein Monster Zeichenfolge verwendet, hergestellt von GROUP_CONCAT. Ich musste bis max am Ausgang wie so dass es an der Arbeit bekommen:

SET SESSION group_concat_max_len = 1000000;

MySql Assistenten da draußen. Auf der relativen Performance der Methoden Kommentar frei fühlen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top