コストを含むデータのテーブルがあります。任意のレコードについて、そのレコードが他のコストとの関係でどこに該当するかを知りたいです。
基本的に、(コストが低いレコードの数)/(レコードの総数)を知りたいです。
これまでのところ、私は思いついた:
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 行になります。