• ベストアンサー

SQL(oracle)での並べ替え

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にすればよいでしょうか? よろしくお願いいたします。

  • Oracle
  • 回答数3
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • jmh
  • ベストアンサー率23% (71/304)
回答No.3

SELECT t.* FROM AAA t ORDER BY MIN(t.DATE) OVER (PARTITION BY t.GNo), t.DATE でどうかしら? 結果を教えてください。

chanpy
質問者

お礼

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

その他の回答 (2)

回答No.2

#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" ; みたいに面倒なことしないと。

chanpy
質問者

お礼

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

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

見てわかりやすいのは以下のようなものでしょうか。 SELECT * FROM AAA a ORDER BY (SELECT MIN(DATE) FROM AAA WHERE GNo=a.GNo),DATE なお、Oracleのバージョンは書かれた方がいいと思いますよ。

chanpy
質問者

お礼

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

関連するQ&A

  • 【Win Vista】アイコン自動配列を止めさせたいのですがどうやればいいんでしょうか?

    私の環境は Windows Vista HomeEdition Service Pack1 です。 アイコンの表示を詳細表示にしています。 そして、 abc.txt efg.txt というファイル並んで格納されているフォルダにbcd.txtというファイルをコピーしたとき、 abc.txt efg.txt bcd.txt と配置されず、並び替えも何もしていないのに自動的に abc.txt bcd.txt efg.txt という風に並べられてしまいます。 右クリックで自動並べ替えボタンでもあるのかと見てみたんですが、そういうものも見当たりません。 親切機能だと思うのですが、それがものすごく煩わしいです。 この自動整列を切る方法わかる人いましたら教えてください。

  • 最新から100行のSELECT文

    タイトルわかりにくくてすみません・・・ logno | value 1 | abc 2 | bcd ・ ・ ・ 2000 | def 2001 | efg のようなデータがあるとします。(データは2002,2003とどんどん追加されます。) このとき、lognoが1902~2001(つまり最新から100行)のデータを読み込むSELECT文を教えてください。 SELECT * FROM table_name ORDER BY logno DESC LIMIT 100; のようにして今まで取り込んできましたが、これでは順序が逆になってしまいます。(2001,2000...の順になってしまう) 逆にならない方法を教えてください。

    • ベストアンサー
    • MySQL
  • 3文字取得して配列に格納するにはどうしたらいいのでしょうか?

    今日1日、考えましたがどのようにすればいいのか解らず時間だけが過ぎてしまい焦っています。 「abcdef1234」という文字列があります。 上記の文字列を下記のように配列にする事は可能でしょうか? ・abc ・bcd ・cde ・def ・ef1 ・f12 ・123 ・234 すみませんがご教授いただけませんでしょうか? 些細な事でも構いませんので宜しくお願いします。

    • ベストアンサー
    • Java
  • 特定の項目が同じ値のレコードを1件だけ出力するには

    教えて下さい。全くいいSQLが思い浮かびません^^; Table:Tbl(Primary Col1, Col2) ================================================ Col1, Col2, Col3, Col4, Col5, Col6 ------------------------------------------------ No1, Row1, ABC1, 1, DEF1, 1 No1, Row2, ABC1, 1, DEF1, 2 No2, Row1, ABC1, 1, DEF1, 1 No2, Row2, ABC1, 1, DEF1, 2 ================================================ 以上のテーブル情報の時、 Col3とCol4をキーにしてレコードを抽出します。 但し、抽出するレコード内容にCol5とCol6が同一なレコードは1件もありません。 上記テーブルから取り出したいレコードは以下の通りです。 Table:Tbl(Primary Col1, Col2) ================================================ Col1, Col2, Col3, Col4, Col5, Col6 ------------------------------------------------ No1, Row1, ABC1, 1, DEF1, 1 No1, Row2, ABC1, 1, DEF1, 2 ================================================ どういうSQLで上記のような抽出が可能になるでしょうか? 宜しくお願い致します。

  • 件数をカウントして日付でソートするSQL

    こんなテーブルがあったとして、 テーブル名:shohin ------------------- type:文字列 create_date:日付 こんなデータになっていたとして type| create_date ----+----------- abc | 2004/02/01 abc | 2004/02/02 abc | 2004/02/03 hhh | 2004/01/30 xxx | 2004/01/12 xxx | 2004/01/13 xxx | 2004/01/14 xxx | 2004/01/15 xyz | 2004/01/01 xyz | 2004/01/05 このようなデータを出力したいのですが… (typeで集計して、create_dateの一番新しい日付でソート) type | count | create_date -----+-------+----------- abc | 3 | 2004/02/04 -----+-------+----------- hhh | 1 | 2004/01/30 -----+-------+----------- xxx | 4 | 2004/01/15 -----+-------+----------- xyz | 2 | 2004/01/05 これを一発で書くSQLって可能でしょうか? 副問い合わせを使えば出来るような気がするのですが、Group By した結果からさらに最新の日付を取得してソートというのがどうも上手く書けませんでした。 お分りになる方がいらっしゃいましたら、ぜひともご教示願います。

  • SQLの書き方を教えて!

    select name,SUM(kingak) from where date between 150221 and 150320 group by frjpc.trcd のようにSUMで集計を行うSQLを発行する時に,同時にkingak順にsortすることは可能なのでしょうか? select name,SUM(kingak) from where date between 150221 and 150320 group by frjpc.trcd order by SUM(kingak) としたいところですが,これではエラーになりますね。 SQLでは解決できないんでしょうか?

  • 1回のSQLで集計結果順にソートする方法を教えてください

    PHP4+MySQLです。 やりたいことがあるのですが、いいSQLが考えつきません。 お知恵を拝借できれば幸いです。 以下のようなテーブルがあるとします。 ID|ITEMid|DATE 1| 232|2009-06-14 2| 156|2009-06-14 3| 156|2009-06-14 4| 232|2009-06-14 5| 232|2009-06-14 6| 567|2009-06-14 これを次のように集計したいのです。 (ITEMidの登場回数順にソートして、実際の回数も出す) 232:3 156:2 567:1 サブクエリの使えない環境で、1回のSQLで集計することはできるでしょうか。できる場合実際のSQL文を教えていただければ幸いです。 テンポラリテーブル使えば自分でもできそうな気がするので、できれば使わない想定でお願いします。

    • ベストアンサー
    • MySQL
  • 特定の文字数のデータだけを抽出するには

    PHP+MySQLでプログラムを製作しています。 SQLについては初心者です。 あるフィールドに格納されているデータが 特定の文字数のものだけを取り出したいのですが、 何か効率的なコーディング方法はありますでしょうか。 たとえば +-----+--------+ | no | test | +-----+--------+ | 01 | a | | 02 | ab | | 03 | abc | | 04 | def | | 05 | abcd | | 06 | efghij | +-----+--------+ の中から”test”フィールドのデータの長さが3である "abc"と"def"のデータだけを抜き出したいのです。 SQLだけでは不可能で、一旦全部読み込んでから プログラムで処理しなくてはいけないでしょうか。 何かよい方法をご存知の方がいらっしゃいましたら、 どうぞよろしくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • VBからのsqlの呼び出し方

    VB6.0について質問です。。。 現在SQLを使用して二つのAccessファイルからデータを取得して CSV出力を行っているのですがかなり無駄な処理をしていそうなので もっと簡略化もしくは効率的に出来る方法はないですか? 取得する項目数が多いので以下のソースを何回も交互におこなっています>< ふたつの異なるデータベースをSQLで呼び出すのに毎回切断して接続の長々としたプログラムで見栄えもわるいです、、、 お知恵をおかしください。 dbs.Close Set MyWorkspace = Workspaces(0) 'iniファイルからmdbのパスを取得 Set dbs = MyWorkspace.OpenDatabase(PATH1) '指定のmdbファイルを開く Set ds = dbs.OpenRecordset("select XXX from abc where No = " & XXX & " ;") 'レコードカウントする tmp2 = tmp2 & ds.Fields(0).Value & "," dbs.Close Set MyWorkspace = Workspaces(0) Set dbs = MyWorkspace.OpenDatabase(PATH2) Set ds = dbs.OpenRecordset("select XXX from efg where No = " & XXX & " ;") tmp2 = tmp2 & ds.Fields(0).Value & "," ・ ・ ・

  • GROUP BYで集約されるときのソートを変えたい

    GROUP BYで集約されるときのソートを変えたい MySQLの5.1を使用しています。 テーブル"tbl"には、"no","id","score"の3つのフィールドがあり、 "no"は主キーです。 +---+----+-------+ | no | id | score | +---+----+-------+ | 1 | 10 | 10002 | | 2 | 10 | 10000 | | 3 | 10 | 10008 | | 4 | 11 | 10004 | | 5 | 12 | 10006 | +---+----+-------+ 上記の表から、 scoreの値が高い順にグループ化してソートしたいのですが、 以下のSQL文ではscoreが最初に登録されたものに集約されてからグループ化されてソートしてしまうため、 思い通りの結果が得られずに困っています。 ↓具体例 SELECT no, id, score FROM tbl ORDER BY score DESC GROUP BY id; +---+----+-------+ | no | id | score | +---+----+-------+ | 5 | 12 | 10006 | | 4 | 11 | 10004 | | 1 | 10 | 10002 | +---+----+-------+ ↓欲しいソート順 +---+----+-------+ | no | id | score | +---+----+-------+ | 3 | 10 | 10008 | | 5 | 12 | 10006 | | 4 | 11 | 10004 | +---+----+-------+ テンポラリテーブルはなるべく使用せずソートしたいのですが、 このような事は可能なのでしょうか? ご存知の方がいらっしゃいましたら教えていただけると助かります。 よろしくお願いします。

    • ベストアンサー
    • MySQL