- PR -

下位5件のデータを上位から取得するには

1
投稿者投稿内容
ひろし
会議室デビュー日: 2002/11/03
投稿数: 9
投稿日時: 2005-02-24 22:49
oracleでソートしたデータを上位5件だけ取得するには
rownum<=5のようにすれば可能だと思いますが、
このソート順のままで下位5件のみ取得することを
1個のSQLで実現するにはどうすればいいのでしょうか?

期待する結果としては、
16位
17位
18位
19位
20位
のような結果を期待しています。

何かよいアイデアがありましたら、ご教授ください。
よろしくお願いいたします。
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2005-02-24 23:19
引用:

ひろしさんの書き込み (2005-02-24 22:49) より:
oracleでソートしたデータを上位5件だけ取得するには
rownum<=5のようにすれば可能だと思いますが、
このソート順のままで下位5件のみ取得することを
1個のSQLで実現するにはどうすればいいのでしょうか?

期待する結果としては、
16位
17位
18位
19位
20位
のような結果を期待しています。

何かよいアイデアがありましたら、ご教授ください。
よろしくお願いいたします。



逆順にソートして上位5件を取得してから、望みの順番にソートし直せばいいのではないでしょうか?

[ メッセージ編集済み 編集者: 永井和彦 編集日時 2005-02-24 23:20 ]
k.o
会議室デビュー日: 2005/03/03
投稿数: 1
投稿日時: 2005-03-03 01:09
解決しましたか?

select t.order, t.name
from (
select rownum as rank, order, name
from ranking
where rownum<=5
order by order desc) t
order by t.order
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2005-03-03 09:37
はにまるです。

引用:

k.oさんの書き込み (2005-03-03 01:09) より:
select t.order, t.name
from (
select rownum as rank, order, name
from ranking
where rownum<=5 ←(※1)
order by order desc ←(※2)) t
order by t.order


これは、半分正しく無いのでは?

(※1)は、(※2)より優先的に処理される為、
提示されてSQL文は、
1.Oracleが無作為に取得した先頭5件を
2.「order」降順で並び替え、
3.その結果を「order」昇順で並び替える
処理になると思います。

但し、「order」項目がIndexとして設定されていると、
Oracleはデータ無作為に取得するのでは無く、
Indexを参照しながらデータを取得する為に、
k.oさんのSQL文でも意図した動きになります。

Indexが張られていない場合は、下記の通りかと。
コード:

select
t.order,
t.name
from (
select
order,
name
from
ranking
order by
order desc
) t
where
rownum <= 5
order by
t.order


また、rownum仮想項目で順位取得をする場合は、
私が提示した様に、全レコードを取得してから
データ加工を行う必要があります。

# 追記
私が提示したのは、k.oさんのSQL文から
rownum <= 5 の条件判断位置を変えただけ。

_________________
OFF企画中ご意見募集

[ メッセージ編集済み 編集者: はにまる 編集日時 2005-03-03 09:41 ]
ひろし
会議室デビュー日: 2002/11/03
投稿数: 9
投稿日時: 2005-03-03 22:16
おかげさまで解決いたしました。
欲しいデータを取得して、それを再度ソートしなおすということですよね。
ちょっと難しく考えすぎたのかもしれません。
みなさま、どうもありがとうございました。
ぷさいくろう
ぬし
会議室デビュー日: 2006/08/30
投稿数: 1034
投稿日時: 2006-09-22 15:42
上位五件はビリからの上位五件
と考える
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2006-09-22 16:33
offset, limit ?

http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/psql_k09.htm

・最後から 3 件問い合わせるには、ソートオーダを逆にすれば良い。

select * from testm
order by key desc
offset 0 limit 3
;

key | data1 | data2 | data3
----------+-------+-------+-------
c003 | 100 | 200 | 300
b002 | 10 | 20 | 30
a011 | 1 | 2 | 3

小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2006-09-25 12:30
Oracleにoffset,limit句は無いと思うのですが・・・。
1

スキルアップ/キャリアアップ(JOB@IT)