アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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)
)

とかですかね。(未検証です)
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/11/17 20:04

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

私はこんなふうに考えてしまいます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/11/17 20:05

元のテーブル名を「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を取っています。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/11/17 20:05

select A, MAX(B),MAX(C),D


from テーブル名
group by A

で良いかと思います。
    • good
    • 1

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

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