• ベストアンサー
  • すぐに回答を!

GROUP BY , MAX の使用法に関して

いつもお世話になります。 GROUP BY , MAX の使用法に関して質問です。 USERCDとKYOUTUNOでグルーピングをしてSEQの最大値のレコードを抽出しようとしています。 以下のようなSQL文の場合ですとBIKOUがないレコードを抽出する事が出来るかと思います。 【select USERCD , KYOUTUNO , MAX(SEQ) from テーブル1 group by USERCD , KYOUTUNO】 そこで、BIKOU も同時に抽出したいのですが、BIKOUを選択列に入れると「GROUP BYの式ではありません。」のエラーが出ます。 「そりゃそうだ」だと思うのですが、どうのようにすればSQL文を作れば結果のようなレコードを抽出出来るのでしょうか? よろしくお願いします。 ◆テーブル1のデータ USERCD KYOUTUNO SEQ BIKOU ------------------------------------- 100 100 1 あああああ 100 100 2 いいいいい 100 100 3 あいうえお 222 200 1 AAAAA 222 200 2 AAAAAA 3333 100 1 うううううう 44444 100 1 ううううう 44444 100 2 えええ ◆結果 USERCD KYOUTUNO SEQ BIKOU ------------------------------------- 100 100 3 あいうえお 222 200 2 AAAAAA 3333 100 1 うううううう 44444 100 2 えええ ■ORACLEのバージョン  Oracle9i

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数1999
  • ありがとう数4

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

  • ベストアンサー
  • 回答No.3

9iスタンダード以降なら、探査回数が一回で済むよう分析関数を使った方が効率的な気がします。 select USERID,KYOUTUNO,SEQ,BIKOU from ( select x.*,row_number() over(partition by USERID,KYOUTUNO order by SEQ desc) R from TABLE x ) where R=1; 分析関数が使えないバージョン・エディションなら、 select * from TABLE where (USERID,KYOUTUNO,SEQ) in (select USERID,KYOUTUNO,max(SEQ) from TABLE); のようなサブクエリを使った解決策になります。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答ありがとうございます。 分析関数。。。 今まで目をつむってきました。これを機に勉強したいと思います。

関連するQ&A

  • GROUP BY句の使用方法について(初歩的)

    GROUP BY句の使用方法について質問させて下さい。 ■使用するテーブル  ID   日付 ----------------------  AAA   2007-04-01  AAA   2007-04-01  AAA   2007-04-02  AAA   2007-04-03  BBB   2007-04-01  BBB   2007-04-03  CCC   2007-04-02  CCC   2007-04-02  CCC   2007-04-02 ■抽出したいこと  ID毎のカウントを取りたいのですが、その際に同じ日付は1回のカウントとして抽出したいのです。  即ち、下記の結果を得るのが目的ですが、どのようなクエリとすればいいでしょうか?  ID  cnout(*) ----------------------  AAA   3  BBB   2  CCC   1 初歩的な質問なのですが、宜しくお願い致します。 (※環境はSQL-Server2000です)

  • GROUP BYを行った後に結合したい。

    oracle8iを使用しています。 2つのテーブルを結合したいと思っていますが、 テーブル構成が、N対Nのテーブルのため、 片方をグループ化したあとに結合させようと思っています。 ところが、単純にGroup byを使うと、結合した後に グループ化してしまうために、期待した値がひょうじされません。 なんとか、1回のSQLで正しく情報をとることはできないものでしょうか。

  • SQLServerのGROUP BYについて

    SQLServerでGROUP BYを使用してデータをSELECTする場合について質問があります。 GROUP BYを行う項目に’△△1’と’1△’というデータが入っていた場合、   ※上記の△は半角スペースです。 ’△△1’と’1△’は同じグループとして、グルーピングされるのでしょうか。 Oracleにデータを移行して、GROUP BYをかけると上記のケースはデータ件数が異なります。 これはSQLServerの仕様なのでしょうか。(バージョンは2000です。) お手数ですが、ご教示願います。 

その他の回答 (2)

  • 回答No.2

not exists を使って select * from tbla a1 where not exists ( select 1 from tbla a2 where a1.usercd = a2.usercd and a1.kyoutuno = a2.kyoutuno and a1.seq < a2.seq );

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答ありがとうございました。 existsにこんな使用方法があったなんて、まだまだ勉強や経験が必要だなぁと思いました。

  • 回答No.1

↓でどうでしょうか?試してないのでちゃんと動くかわかりませんが・・・。 select * from テーブル1 t1 where t1.SEQ = ( select max(t2.SEQ) from テーブル1 t2 where t2.USERCD = t1.USERCD and t2.KYOUTUNO = t1.KYOUTUNO )

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答ありがとうございます。 ばっちり動きました。

関連するQ&A

  • GROUP BYについて

    初歩的な質問になってしまいますが、GROUP BYの使い方について解らない点があるので、宜しくお願いします。 次のようなボーリング大会のレコードがあったとして、 ========bowling TBL (以下、フィールド名)===================== 氏 名|ゲーム回数|1投目|2投目|3投目|・・10投目| ============================================================ 注※ゲーム回数はintで1からインクリメントしていく。 氏名別に1番最後に行ったゲームを参照したい場合 ●SELECT 氏名 MAX(ゲーム回数) GROUP BY 氏名 で、 ----------------------------------------------------- Aさん|3| Bさん|5| ----------------------------------------------------- が得られますが、更にこの最終ゲームでの1投目と2投目の結果のみを付け足し、 ----------------------------------------------------- Aさん|3|12本|19本| Bさん|5|03本|15本| ----------------------------------------------------- のように参照したい場合、どのようなSQL文になるのでしょうか? どなたかご教示宜しくお願いします。

    • ベストアンサー
    • MySQL
  • group by句

    以下のSQL文がoracle9iでOKで8iで通らないのですが、8iでも通るようになんとかできないでしょうか。 select a.val_Id, (select val_nm from tableA where val_id = a.val_id) as val_nm from tableA a group by a.val_id テーブルの内容 tableA( val_id number(1,0), val_code number(2,0), val_nm varchar(10) ) val_idとval_codeで一意となっています。 val_nmはval_idと一対一になっています。 要するにval_idに対応するval_nmも一緒に取得したいのですが、select句のサブクエリで8iの場合"group byの式ではありません"とおこられてしまいます。 ちなみに、今ここでは簡略化しているのですが本来は色なテーブルを結合しているので、単にgroup by val_id,val_nmとするのは無しでお願いいたします。 わかりにくいかとは思いますがお知恵をお貸しください。宜しくお願いいたします。

  • group byで最後のレコードを抽出したい

    group byで特定のカラムをまとめる際に、最後(最新)のレコードを抽出したいのですが 最初(古い)の行が抽出されてしまいます。 例えば、threadカラムとuptimeカラムがあるテーブルBBSで threadカラムをgroup byでまとめる際にuptimeの降順(desc)でまとめたい場合 どのようにしたらいいでしょうか? 【テーブルBBS】 id thread uptime 1 1 1230100000 2 2 1230200000 3 1 1230300000 4 3 1230400000 5 1 1230500000 6 2 1230600000 select * form bbs group by thread order by uptime desc だと thread uptime 3 1230400000 1 1230300000 2 1230200000 になってしまいます。 次のような結果を表示するにはどのようにしたらいいでしょうか。 thread uptime 2 1230600000 1 1230500000 3 1230400000 また、DISTINCTを使うと同じフィールド内に重複したレコードがある場合は最初のレコードのみ表示されますが、最後のレコードのみ表示するにはどのようにすればいいのでしょうか? よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • GROUP BYと副問い合わせ

    SQLで悩んでいるので質問いたします。 テーブル例 日付 タイプ 個数  0901  1    5 0901  1    3 0901  2    2 0901  2    4 0901  3    1 0901  3    2 0902  1    5 0902  1    3 : : とあります。 このデータを日付毎、タイプ毎に個数を取得したいと考えています。 そこで下記のようにSQLを実行 SELECT 日付、sum(個数)asタイプ別個数、タイプ count(*) as タイプ別レコード数 FROM テーブル名 GROUP BY 日付、タイプ ORDER BY 日付、タイプ 取得できるレコードは下記のようになります。 日付 タイプ別個数 タイプ タイプ別レコード数 0901      8    1     2 0901      6    2     2 0901      3    3     2 : となります。 ここまでは簡単にいけたのですが、 できればタイプ別の個数を日付で1レコードで取得できないかと悩んでいます。 期待している取得レコードは下記です。 日付 タイプ1個数 タイプ2個数 タイプ3個数 レコード数 0901     8      6      3      6 0902 : このようにするためにSELECT部分に副問い合わせをしようとしていますがうまくいきません。 SQLで出来る方法があれば、教えてください。 よろしくお願いします。

  • SQLPLUSのGROUP BY句について

    Oracle9iのSQLPLUSにて、GROUP BY句で指定した列以外の列をSELECT文の選択結果に表示させたいだけなのですがうまくいきません。 SELECT 列A,列B,列C FROM テーブル1 A INNER JOIN ( SELECT 列A,COUNT(*) FROM テーブル1 GROUP BY 列A HAVING COUNT(*) >= 2 ) B ON A.列A = B.列A 「"B.列A"が無効識別子です」エラーが発生します。 何卒宜しくお願い致します。

  • SQL GROUPで件数の一番多いレコードのみ取る

    SQL GROUPで件数の一番多いレコードのみ取る ORACLE10です。 次のようなテーブルがあります。 USER -----------テーブル名 ID,NAME,DATA----列名 1,A,any 1,A,any 1,B,any 2,C,any 3,D,any このテーブルから、IDをGROUPにして、さらに、一番使用頻度の多いNAMEを取得したいのです。 表示したいのは、IDとNAMEです。 つまり、取得結果例は次のようになります。 取得結果例 ID,NAME----列名 1,A 2,C 3,D SQL文をどのように作れば可能でしょうか? ちなみに、IDやNAMEのマスタテーブルはありません。 自分では、「(select ID, NAME, count(*) from USER group by ID, NAME) COUNT」で、COUNTを内部テーブルにして、グループ内で一番多いcount(*)をmaxで取得してみようかと思ったんですが、そこからアイデアが出ませんでした。

  • group by がうまくいきません。

    以下のようなデータがあります。 管理番号 ステータス 受付日 502035   50     2012/09/28 502035   30     2012/09/25 502035   40     2012/09/30 502036   10     2012/09/28 502036   20     2012/09/30 502037   10     2012/09/29 上記のテーブルを管理番号でグループ化し、 ステータスの一番小さい番号の受付日を抽出したいと 考えています。 管理番号 ステータス 受付日 502035   30     2012/09/25 502036   10     2012/09/28 502037   10     2012/09/29 ↑求めたいSQL内容 SELECT 管理番号, Min(ステータス), 受付日 FROM ステータステーブル GROUP BY 管理番号 で行うと、受付日が異なるステータスだと 複数抽出されてしまいます。 First(受付日) Last(受付日)にすると受付日が うまく抽出されません。 受付日をステータスが一番小さな管理番号 でグループ化し、表示することはできますでしょうか? よろしくおねがいいたします。

  • SQL GROUP BY

    SQLについてお聞きしたいです。番号カラムの中で最大の数字をもつフィールドと 同じコードを持つデータを、表から全て取得したいと思っているのですが 書き出すとGROUP BYの式が間違っているというエラーが出てしまいます。 SELECT * FROM 表 GROUP BY コード HAVING MAX(番号) = コード どう調べればいいのか分からず四苦八苦しています。どこを直せばよいでしょうか?

  • GROUP BY句の集計について

    はじめまして。 いろいろ調べて、何度試しても思うように 結果がでなかったので、投稿させて頂きました。 グループの集計をしてるのですが、 何個のグループがあるのかカウントしたいのです。 aaa bbb 110 a 110 b 111 c 112 d というDBに select aaa, bbb, count(*) as cnt from database GROUP BY aaa ORDER BY aaa だとそのグループ内の該当レコード数がカウントされてしまいます。 上記の例だとグループ数が“3”と結果を返すようにしたいのです。 では。宜しくお願いします。

    • ベストアンサー
    • MySQL
  • group by句

    色々と試行錯誤してやっていますが、なかなか自分の 思うような結果が得られないためご質問させて下さい。 テーブルが全部で3つあります。 テーブルA id name 1 巨人 2   西武 テーブルB id name 1 小笠原 2 ラミレス 3 中島 4  片岡 テーブルC id テーブルAID テーブルBID 背番号 1 1 1 30 2 1 2 10 3 2 3 3 4 2 4 8 テーブルを結合し、テーブルCにある 背番号をテーブルAid,テーブルBidを元に sumしたいのですがうまくいきません。 以下がそのSQLになります。 (1)サブクエリーを使ったSQL この場合値が重複されて表示されてしまいます。 select a.name,b.name,c.name, (select sum(背番号) from tableC c where c.テーブルAId = a.id group by c.テーブルAid ), (select sum(背番号) from tableC c where c.テーブルBid = bid group by c.テーブルBid ) from tableC c inner join tableA a on a.id = c.テーブルAid inner join tableB b on b.id = c.テーブルBid (2) select a.name,b.name,c.name, (select sum(背番号) from tableC c where c.テーブルAId = a.id ), (select sum(背番号) from tableC c where c.テーブルBid = bid ) from tableC c inner join tableA a on a.id = c.テーブルAid inner join tableB b on b.id = c.テーブルBid group by c.テーブルAid 重複はされないのですが、group byが一つのみなので ちゃんとした出力がされません。    他にやり方があるのかもしれませんが、お分かりになる方が    いらっしゃいましたら、ご教授お願い致します。