• ベストアンサー

SQL文をご教授願います

SQL文をご教授願います。 以下のようなテーブルを仮定しています。 A   B    C   D ---------------------- 10  100  1203 A 10  200  1204 B <--- 取得したい 11  300  1203 C 11  300  1204 D <--- 12  400  1206 D 12  500  1207 E <--- ・ ・ A列をー意にして、A列・D列のデータを取得したい 条件 Bの大きい方を取得する Bの値が同じ場合はCの大きい方を取得する。 (A列には同じデータが2以上あるとします) (C列には同じデータはありません) 欲しい結果 A   D -------- 10 B 11 D 12 E

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

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

RDBに何を使われているか書いてないので、”それなりに動きそうなSQL”しか 書けませんが・・・ select A,B from ほにゃらら as X where not exists ( select 1 from ほにゃらら as Y where (X.A=Y.A and X.B<Y.B) or (X.A=Y.A and X.B=Y.B and X.C<Y.C) ) とかですかね。(未検証です)

SQL
質問者

お礼

期待した結果を出すことができました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • yeslets
  • ベストアンサー率31% (47/151)
回答No.3

GROUP BYを使った時はGROUPにした列と集計関数しか使えないので 単純に考えると 第一段階  AをGROUPにしてBの最大(MB)を求める 第二段階  AとMBをGROUPにしてCの最大(MC)を求める 第三段階  A・MB・MCがそれぞれA・B・Cである行を求める となるような気がします。 CREATE VIEW FIRST AS SELECT A,MAX(B) AS MB FROM TABLE GROUP BY A CREATE VIEW SECOND AS SELECT TABLE.A, MB ,MAX(TABLE.C) AS MC FROM TABLE,FIRST WHERE TABLE.A = FIRST.A AND TABLE.B = MB SELECT TABLE.A,TABLE.D FROM TABLE,SECOND WHERE TABLE.A = SECOND.A AND TABLE.B = MB AND TABLE.C = MC 私はこんなふうに考えてしまいます。

SQL
質問者

お礼

参考にさせていただきました。

すると、全ての回答が全文表示されます。
  • osumitan
  • ベストアンサー率33% (102/307)
回答No.2

元のテーブル名を「T_DATA」と勝手に決めましたが、 以下のSQLで目的のデータが取れました。 SELECT T_DATA.A, T_DATA.D FROM T_DATA INNER JOIN (SELECT A AS MAX_A, MAX(B) AS MAX_B, MAX(C) AS MAX_C FROM T_DATA GROUP BY A) AS T_MAX ON T_DATA.A = T_MAX.MAX_A AND T_DATA.B = T_MAX.MAX_B AND T_DATA.C = T_MAX.MAX_C 「同一のAの中で、Bが大きいか、Bが同じならCが大きいもの」を まず先に探しています(カッコ内のサブクエリ)。 本当ならここでそのときのDの値もほしいところですが、 GROUP BYを使ったときは、そのGROUP BYを行った項目か、 それ以外の項目なら集合関数をかませなければならないので この時点でDを取得することはできません。 そこでそれをサブクエリにし、元のテーブルと結合させて AとBとCの値を条件にしてDを取っています。

SQL
質問者

お礼

参考にさせていただきました。

すると、全ての回答が全文表示されます。
  • PCFREAK
  • ベストアンサー率51% (417/805)
回答No.1

select A, MAX(B),MAX(C),D from テーブル名 group by A で良いかと思います。

すると、全ての回答が全文表示されます。

関連するQ&A