4

単純なデータ テーブルがあり、クエリから約 40 パーセンタイルにある行を選択したいと考えています。

最初にクエリを実行して行数を見つけてから、n 番目の行を並べ替えて選択する別のクエリを実行することで、今すぐこれを行うことができます。

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

93、93*0.4 = 37 のような値を返す場合があります。

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

これら 2 つのクエリを 1 つのクエリに結合できますか?

4

3 に答える 3

1

これにより、約 40 パーセンタイルが得られ、行の 40% がそれより少ない行が返されます。40 パーセンタイルに正確に一致する行はないため、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
于 2010-06-17T21:52:59.600 に答える
0

GROUP_CONCAT によって作成されたモンスター文字列を使用するこのソリューションもあります。出力を機能させるには、次のように出力の最大値を上げる必要がありました。

SET SESSION group_concat_max_len = 1000000;

MySql ウィザード: メソッドの相対的なパフォーマンスについて自由にコメントしてください。

于 2011-03-18T17:02:07.557 に答える
0

テーブルが MYISAM の場合 (または 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';
于 2010-06-17T22:04:29.137 に答える