電子書籍の厳選無料作品が豊富!

お世話になります。Oracle初心者です。RANK関数による順位付けについて悩み、検索してもわからず困っております。
次のような表tbがあります。
数値,順
70
10
30
この「順」のカラムに順位を付けて
数値,順
70,3
10,1
30,2
としようとしています。SELECTなら
SELECT 数値,rank() over (order by 数値 desc) from tb;
が成功します。これでupdateする場合、
(rank() over (order by 数値 desc))をした値を
update tb set 順=
とすればよいと思うのですが、うまくいきません。
PL/SQLを使わず、SQLでRANK関数を使って順位付けするにはどのようにしたらよろしいでしょうか。
勉強不足だと思い、申し訳なく思います。何卒よろしくお願いいたします。

A 回答 (1件)

SET句でRANK関数を使うことはできません。


(使うことができるRDBMSもあるようです)
UPDATE文でRANK関数を使用するときは、少し面倒なことになります。

update tb set 順 = (
select t2.順 from (
select 数値, rank() over (order by 数値 desc) as 順 from tb
) t2
where t2.数値 = tb.数値
);

# 例のテーブル構成では、数値が重複している場合、
# 上記UPDATE文は失敗します。
# 実際には主キーがあるでしょうから
# その点は工夫してください。
# ちなみに下記UPDATE文なら重複していてもOKです。

RANK関数を使用しない方法もあります。

update tb set 順 = (
select count(t2.数値) + 1 from tb t2
where t2.数値 > tb.数値
);

# 例のSQL文と処理結果が合致しません(降順と昇順)。
# とりあえず降順で処理しています。
    • good
    • 0
この回答へのお礼

dda167様 さっそくのご回答ありがとうございました。
update tb set 順 = (
select count(t2.数値) + 1 from tb t2
where t2.数値 > tb.数値
);    で処理することができました。
参考になり、感謝しております。
RANK()関数については、私の知識ではすぐには理解できそうもないので、勉強してみます。
本当にありがとうございました。

お礼日時:2009/12/28 18:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!