1

コストを含むデータのテーブルがあります。任意のレコードについて、そのレコードが他のコストとの関係でどこに該当するかを知りたいです。

基本的に、(コストが低いレコードの数)/(レコードの総数)を知りたいです。

これまでのところ、私は思いついた:

SELECT (SUM(IF(r.cost > c.cost, 1, 0)) + 1) / COUNT(1) as percent_rank 
FROM record r, 
   (SELECT cost FROM record WHERE cost IS NOT NULL) as c 
WHERE r.id = 10;

このクエリで EXPLAIN を実行すると、以下が生成されます。

+----+-------------+------------+-------+---------------+---------+---------+-------+-------+-------------+
| id | select_type | table      | type  | possible_keys | key     | key_len | ref   | rows  | Extra       |
+----+-------------+------------+-------+---------------+---------+---------+-------+-------+-------------+
|  1 | PRIMARY     | r          | const | PRIMARY       | PRIMARY | 4       | const |     1 |             |
|  1 | PRIMARY     | <derived2> | ALL   | NULL          | NULL    | NULL    | NULL  | 21469 |             |
|  2 | DERIVED     | record     | ALL   | NULL          | NULL    | NULL    | NULL  | 21469 | Using where |
+----+-------------+------------+-------+---------------+---------+---------+-------+-------+-------------+

このクエリを実行するより良い方法はありますか? 21469 はテーブル内のすべてのレコードです。クロス結合について少し心配ですが、このクエリは常に id = something で実行されるため、1 * 合計 num 行になります。

4

1 に答える 1