SQLでテーブルのデータに順位付けするのって、どうやるんだろう。ということで、ちょっとばかし考えてみた。
例として、次のような商品テーブルがあって、その価格が高い方から順に、1位、2位…と順位付けするケースを考えてみる。サンプルに深い意味はないです。
| id | name | price |
|---|---|---|
| 1 | FOMA F702iD | 19200 |
| 2 | FOMA F902i | 24800 |
| 3 | FOMA N701i | 12350 |
| 4 | FOMA P901iS | 22560 |
| 5 | FOMA P901iTV | 32400 |
| 6 | FOMA SH702iD | 19740 |
| 7 | FOMA SH901iS | 17690 |
| 8 | FOMA SH902iS | 31220 |
| 9 | FOMA SO702i | 16600 |
| 10 | FOMA SIMPURE N | 3680 |
| 11 | FOMA N902i | 24100 |
順位付けには、次のようなSQLを考えてみた。
SELECT
COALESCE(rank, 1) AS rank,
name,
price
FROM
product
LEFT OUTER JOIN (
SELECT
(count(*) + 1) AS rank,
p1.id
FROM product AS p1
CROSS JOIN product AS p2
WHERE p2.price>p1.price
GROUP BY p1.id
) AS rank_table
USING (id)
ORDER BY rank
もし価格が同じ商品があった場合は、順位タイということで、同じ順番が振られる。なので、ユニークな順位が求められるケースでは、ちょいと工夫が必要です。
できるにはできたんだけど、使うことは無さそうだなあ。相当数あるときは、CROSS JOIN でパフォーマンスが落ちそうだし、JavaなりPHPなり別言語でやった方がラクチンだし。もっと効率の良い方法があれば、嬉しいんだけど。
このエントリーのトラックバックURL
http://www.deftrash.com/admin/mt4/mt-tb.cgi/336
