• ベストアンサー

最大値を含むレコードの抽出

お世話になります。 SQLでIN句やサブクエリではなく、HAVING句+MAX関数を使用して最大値を含むレコードを抽出することはできるのでしょうか。 id | name | value --------------- 1 | aaaa | 2000 2 | aaaa | 1000 3 | bbbb | 1000 上の表でいうとnameフィールドでグルーピングしてidの1と3が抽出対象になります。MySQLを使用しておりますが、 標準SQLでお願いしたいです。 よろしくどうぞ。

  • MySQL
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

1と3のid,name,valueを取得するということですよね? 基本的にgroup byするときにselectできる項目はgroup by にある項目か集計関数を使った値のみです。 つまり、select id,name,valueとするには group by id,name,valueとする必要があるわけです。 そう考えると無理でしょう。 なぜ、「サブクエリを使わずに」なのでしょうか?

kanade-goo
質問者

お礼

やはり無理ですよね(^^;) Java Persistence Query Language (JPQL)をコード内で使っています。移植性の観点からJPQLが導入されたもののSQLに戻ってしまいそうな予感が、ということで後の保守性を考えて可能な限りシンプルな文にしたいと思っていました。 質問の件、確証がもてなかったので質問させていただきました。 ありがとうございました。

その他の回答 (2)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.3

多分、無理だと思います。

kanade-goo
質問者

お礼

そう思いつつ質問してしまいました・・・ ご回答ありがとうございました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

質問の意図がよくわからないのですが、サブクエリを使わずにということは テンポラリを一度つくって・・・というトンチではないですよね? SQLを少し学習すればわかりますがnameでgroup by してvalueのmaxを得る場合 そこでたまたまでてくるidはmaxのものであるという保証はありません。 なのでおっしゃることを一本のSQLでおこなうことはできません。 すなおにサブクエリをつかってください。

kanade-goo
質問者

お礼

>idはmaxのものであるという保証はありません。 そうですよね。質問の用件に迫られることが多くて「やり方を知らないだけでできるのではないか?」と思い質問させていただきました。 ありがとうございました。

関連するQ&A

  • 連結したフィールドでグループ化し、他のフィールドの最大値のレコード全体を抽出

    図面管理のデータベースをつくっています。 連結したフィールドでグループ化し、他のフィールドの最大値のレコード全体を抽出したいのですが どのようにしたらいいのでしょうか? いろいろ調べたのですがなかなかよい結果が出ません。 お知恵をおかしください。よろしくお願いします。 mysqlバージョン:5.0.45 例 テーブル:a(図面管理) a_id(id) a1(図番) a2(種類用紙サイズ) a3(枝番) a4(図面名) a_id a1 a2 a3 a4 1   1 3P 0 aaaa 2   2 3P 0 bbbb 3   2 3P 1 bbbb 4   1 4P 0 cccc 5   1 4P 1 cccc 6   1 4P 1 cccc このテーブルのa1とa2を連結します。(連結フィールド:ren) a_id a1 a2 a3 a4  ren 1   1 3P 0 aaaa 13P 2   2 3P 0 bbbb 23P 3   2 3P 1 bbbb 23P 4   1 4P 0 cccc 14P 5   1 4P 1 cccc 14P 6   1 4P 2 cccc 14P 連結したもの(ren)をグループ化しますこのとき、枝番の値が高いレコードだけ抽出します。 a_id a1 a2 a3 a4  ren 1   1 3P 0 aaaa 13P 3   2 3P 1 bbbb 23P 6   1 4P 2 cccc 14P この最終的な結果を出す方法をお教えください。 おねがいします。

    • ベストアンサー
    • MySQL
  • 重複しているデータを取得したい

    [TBL_TEMP] ID 年月1  年月2 項目A  項目B -------------------------------------------- 1 200909 200910 aaaa bbbb 2 200807 200809 aaaa bbbb 3 200909 200910 aaaa bbbb 4 200909 200909 aaaa bbbb 5 200807 200809 aaaa bbbb 上記のようなデータがあり、年月1と年月2でグルーピングして、重複しているデータを抽出する場合は、以下のSQLでデータを取得できます。 SELECT MIN(ID),年月1,年月2 FROM TBL_TEMP GROUP BY 年月1,年月2 HAVING COUNT(1) >= 2 上記のSQLの場合、重複データの中でIDが一番小さいもののみが取得されるため、ID=1、2の2データが取得できます。 これを重複データ全件、つまり、ID=1,2,3,5のデータを取得するには、SQLをどのように書けばよいのかがわかりません。 どなたかアドバイスを頂けないでしょうか? よろしくお願いいたします。

  • MySQLで、日付最大のレコード抽出

    MySQLをJAVAで使っています。 指定キーの中で、一番日付の大きなレコード項目全てを 取り出したいのですが、 下記SQLだと、何も抽出されません。 (今朝、ここで教えて頂いたSQL文です) 何が間違っているのでしょうか? さらに、もっと簡単なSQL文はないでしょうか? SELECT * FROM food WHERE (food_id = 1) AND (food_name = 'みかん') AND (karute_id = (SELECT MAX(date) FROM food WHERE (food_id = 1) AND (food_name = 'みかん'))) 与える検索キー項目は、food_id=1, food_name=みかん foodテーブル例 food_id  food_name   date --------------------------------- 1     みかん    2015-01-01 1     みかん    2015-02-01 1     みかん    null 1     みかん    2015-04-01 2     きんめだい  2015-01-01 2     じんたん   2015-02-01 2     コロッケ   2015-02-01

    • ベストアンサー
    • MySQL
  • MySQLで、日付最大のレコード抽出

    MySQLをJAVAで使っています。 指定キーの中で、一番日付の大きなレコード項目全てを 取り出したいのですが、 下記SQLだと、何も抽出されません。 何が間違っているのでしょうか? さらに、もっと簡単なSQL文はないでしょうか? SELECT * FROM food WHERE (food_id = 1) AND (food_name = 'みかん') AND (food_id = (SELECT MAX(date) FROM food WHERE (food_id = 1) AND (food_name = 'みかん'))) 与える検索キー項目は、food_id=1, food_name=みかん foodテーブル例 food_id  food_name   date --------------------------------- 1     みかん    2015-01-01 1     みかん    2015-02-01 1     みかん    null 1     みかん    2015-04-01 2     きんめだい  2015-01-01 2     じんたん   2015-02-01 2     コロッケ   2015-02-01

    • ベストアンサー
    • MySQL
  • テーブルの最後(最新)のレコードを抽出したい

    宜しくお願いします。 PHP MYSQL の組み合わせで使っています 以下のようにして、最後のレコードを取り出したいのですが まったく違う事をしているのかもしれません。 $sql =" select * from テーブル where フィールド='max' " ; フィールドはauto_incrementで番号を振っています。 これで最大のつもりなのですが・・・。 他にも、レコードを入れた時間も記録したフィールドがあるのですが どうしてよいか?判りません。 テーブルの最新のレコードを出したいのです。 **その中の一つのフィールドを取り出すのですが、   それはうまくいっているみたいです    (max の所に数字を入れると表示します) お手数かけますが、どなたかご教授お願いいたします。

    • ベストアンサー
    • MySQL
  • SQLで1つのレコードから複数行挿入するには

    下記のようなレコードがあります。 node_id_1 node_nm_1 node_id_2 node_nm_2 ------------------------------------- 00001   AAAA    00002   BBBB 00003   CCCC    00004   DDDD このレコードを元に下記のようなデータを別テーブルに挿入したいのですが、SQLで可能でしょうか id node_id node_nm ----------------- 1  00001  AAAA 1  00002  BBBB 2  00003  CCCC 2  00004  DDDD idはシーケンスで取得します。そして、同一レコードだったものには同じidを振ります。 DBはPostgreSQL 8.4です。

  • 抽出結果にレコードNoを付与することは可能?

    mysql5.0.18です よろしくお願いします 抽出結果にレコードNoを付与したいのです 実際には順位(同点は同順)としたいのですが 複雑になりそうなので 単純に、抽出結果に先頭から連番が振れればOKです 例えば テーブル名:test_table カラム:keys,data,value keys  data  value a001  aaaa  80 a002  aaaa  90 b001  bbbb  100 b002  bbbb  51 上記のテーブル内容から 抽出します Select keys,data,value From test_table Where keys Like '%002' Order By value Desc, data Asc 抽出結果 keys  data  value a002  aaaa  90 b002  bbbb  51 上記抽出結果を keys  data  value  rec_no a002  aaaa  90    1 b002  bbbb  51    2 のように 抽出結果に先頭から連番を振りたいのです このようなことは実現できるのでしょうか? temporaryは使用したくありません (Dropのタイミングがよく分からないので・・・) viewはOKです 理想は・・・ Select keys,data,value,rec_no(auto increment) From test_table Where keys Like '%002' Order By value Desc, data Asc のような事ができないのかな?と妄想していますTT よろしくお願いします

    • ベストアンサー
    • MySQL
  • フィールドを連結しグループ化した時の値の枝番の最大値を常に表示

    フィールドを連結しグループ化した時の値の枝番の最大値を常に表示 すいません。MYSQLでこんなことができるのかお教えください。 mysqlバージョンは、5.0.45を使用しています。 1.以下のような図面を管理するテーブルがあるとします。 例 テーブル:a(図面管理) a_id(id) a1(図番) a2(種類用紙サイズ) a3(枝番) a4(図面名) a_id a1 a2 a3 a4 1   1 3P 0 aaaa 2   2 3P 0 bbbb 3   2 3P 1 bbbb 4   1 4P 0 cccc 5   1 4P 1 cccc 6   1 4P 2 cccc 2.このテーブルのa1とa2を連結したとします。(連結フィールド:ren) ※a1とa2を連結した名称を図面名として使用しています。 ※a3が枝番で図面のマイナーチェンジのバージョンだとお考えください。 a_id a1 a2 a3 a4  ren 1   1 3P 0 aaaa 13P 2   2 3P 0 bbbb 23P 3   2 3P 1 bbbb 23P 4   1 4P 0 cccc 14P 5   1 4P 1 cccc 14P 6   1 4P 2 cccc 14P 3.この連結したフィールド(ren)の枝番(a3)の最大値(max_a3)をSQLで表示させたいのですがどのようにしたらいいのでしょうか? このような結果は求められるのでしょうか? 最終的な結果表示 a_id a1 a2 a3 a4  ren max_a3 1   1 3P 0 aaaa 13P 0 2   2 3P 0 bbbb 23P 1 3   2 3P 1 bbbb 23P 1 4   1 4P 0 cccc 14P 2 5   1 4P 1 cccc 14P 2 6   1 4P 2 cccc 14P 2 説明がへたかもしれませんがよろしくお願いします。

    • ベストアンサー
    • MySQL
  • 抽出したデータの結合

    困ってる点があります。 抽出したフィールドの文字列を結合させるにはどうしたら良いでしょうか。 例) studentテーブルに「id」「name」という二つのカラムがあるとします。 抽出したidとnameをスラッシュ(/)を挟んで結合したいです。 select id,name from student →このSQLを実行すると 「001,相沢」が出力されるとすると 「001/相沢」となるように抽出したいと思っております。 SQLが初心者なものでどなたか教えてください。 よろしくお願いいたします。

  • Excel抽出のマクロかVBAを教えてください

    A列にxxxがあった場合、その上に存在するIDの値を抽出する方法を教えていただけますでしょうか? 例)xxxがあった場合、IDの値を抽出したい。 以下の場合、ID:1111とID:3333と表示したい。 (ID以降の値はランダムです) A列 ID:1111 aaaa bbbb cccc dddd eexxx ←xxxがあるのでその上のIDを抽出 ffffff ID:2222 aaaa bbbb cccc dddd eeee ffffff ID:3333 aaaa bbbb cccc dddd eexxx ←xxxがあるのでその上のIDを抽出 ffffff