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