dポイントプレゼントキャンペーン実施中!

SQL(oracle)での並べ替えで質問がございます。


TABLE:AAA

NO, NAM,GNo, DATE
------------------
1, abc, 3, 09/01
2, bcd, 2, 08/25
3, cde, 2, 08/23
4, def, 3, 09/05
5, efg, 1, 09/03
6, fgh, 3, 08/21

のようなテーブルがあったときに、下記条件で並べ替えを
したいと思っています。

1.GNo毎に最小のDATEを抽出し、各Gnoの最小のDATEのうち
  小さいGNoのグループでソート。
2.1で同一GNo内ではDATEが小さい順にソート。

つまり、上記の例では、各GNoの最小のDATEは、
1・・・09/03
2・・・08/23
3・・・08/21
なので、これからDATEの小さい順に、GNoが
3、2、1の順にソートをします。各GNo毎にもDATEが小さい順に
ソートをするので、結果として、

NO, NAM,GNo, DATE
------------------
6, fgh, 3, 08/21
1, abc, 3, 09/01
4, def, 3, 09/05
3, cde, 2, 08/23
2, bcd, 2, 08/25
5, efg, 1, 09/03

のような順番にしたいのです。この結果のようにするには、
どのようなSQLにすればよいでしょうか?
よろしくお願いいたします。

A 回答 (3件)

SELECT t.* FROM AAA t ORDER BY


MIN(t.DATE) OVER (PARTITION BY t.GNo), t.DATE
でどうかしら?
結果を教えてください。
    • good
    • 0
この回答へのお礼

ご回答どうもありがとうございます。
このやり方で思うようなソートができました。
どうもありがとうございました。

お礼日時:2008/09/23 00:05

#1どののSQLだと、同一の最小DATEを持つGNoがあるとき、くしゃくしゃな結果に成るように思うんですよね。



select x."NO",x."NAM",x."GNo",x."DATE"
from
AAA x,
(
select "GNo",min(R) sortkey
from
(select "GNo",row_number() over(order by "DATE","GNo") R from AAA)
group by "GNo"
) y
where x."GNo"=y."GNo"
order by y.sortkey,x."DATE"
;

とか

select x."NO",x."NAM",x."GNo",x."DATE"
from
AAA x,
(
select "GNo",min(R) sortkey
from
(
select "GNo",rownum R
from (select "DATE","GNo" from AAA order by "DATE","GNo")
)
group by "GNo"
) y
where x."GNo"=y."GNo"
order by y.sortkey,x."DATE"
;

みたいに面倒なことしないと。
    • good
    • 0
この回答へのお礼

ご回答どうもありがとうございます。
すみません、ちょっと試せなかったのですが、
ANo.3さんのやり方でうまくいきました。
どうもありがとうございました。

お礼日時:2008/09/23 00:04

見てわかりやすいのは以下のようなものでしょうか。


SELECT * FROM AAA a
ORDER BY (SELECT MIN(DATE) FROM AAA WHERE GNo=a.GNo),DATE

なお、Oracleのバージョンは書かれた方がいいと思いますよ。
    • good
    • 0
この回答へのお礼

さっそくのご回答どうもありがとうございました。
試してみます。Oracleのバージョンは9iです。

お礼日時:2008/09/19 06:54

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

関連するカテゴリからQ&Aを探す