- PR -

組合せの最大値を取得する方法

投稿者投稿内容
TAKEZO
ベテラン
会議室デビュー日: 2003/12/25
投稿数: 59
投稿日時: 2006-08-23 13:21
以下のようなテーブルからA,Bの組合せで最大値を取得するスマートな方法はありませんでしょうか?連結した上でmaxするのは出来れば避けたいと思っています。
よろしくお願いします。

A B C
-------
1 1 A
1 3 B
3 1 C
3 2 D ←これを取得したい

[ メッセージ編集済み 編集者: TAKEZO 編集日時 2006-08-23 13:22 ]
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2006-08-23 13:29
質問に質問で返してしまい恐縮ですが

A B C
-------
1 1 A
1 3 B
3 1 C
3 2 D
2 3 E

とある場合、
DとEどちらが最大になるのでしょうか。
また、

A B C
-------
1 1 A
1 3 B
3 1 C
3 2 D
3 2 F

とある場合、取得するものはDまたはFなのか、DとFの両方なのか

それによっても考え方が変わってくると思います。

A,Bの組合せで最大である、
というのをどう定義しているのか、
そこが重要です。


A B C
-------
2 6 A
3 4 B
4 3 C
6 2 D

なんてテーブルの場合
どれが最大なんでしょうね。
TAKEZO
ベテラン
会議室デビュー日: 2003/12/25
投稿数: 59
投稿日時: 2006-08-23 13:35
すみません、条件が漏れておりました。フィールドAの値を優先したいと思っています。
また、この条件で2件のレコードが該当した場合ですが、それはそれで構わないです。
つまり、例に挙げていただいた内容の場合、DとFのレコードが取得できればOKです。

A B C
-------
1 1 A
1 3 B
3 1 C
3 2 D
3 2 F

また、下記の場合はDのレコードを取得したいと考えています。
A B C
-------
2 6 A
3 4 B
4 3 C
6 2 D


[ メッセージ編集済み 編集者: TAKEZO 編集日時 2006-08-23 13:38 ]
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2006-08-23 13:44
連結するしかないと思います。
嫌な感じのSQL文になりますが・・・。
eternia
常連さん
会議室デビュー日: 2006/02/23
投稿数: 42
投稿日時: 2006-08-23 14:01
order by で (A+B) ,A 両方の降順に並び替えれば
一番上のレコードが最大値になりませんでしょうか?
TAKEZO
ベテラン
会議室デビュー日: 2003/12/25
投稿数: 59
投稿日時: 2006-08-23 14:12
あすかさん
とりあえず、連結以外でこんな方法でも出来そうですが、こちらもスマートとは
程遠いようです。。。そういう意味では連結のほうがスマートかも知れません。
今回は幸いAもBも桁数が決まっているのでこの方法を採用しようと思いますが桁数
に左右されるのは少し嫌な感じがしますね。。。

select * from
(select * from TABLE where A = (select MAX(A) from TABLE))
where
B = (select MAX(B) from (select * from TABLE where A = (select MAX(A) from TABLE)))


eterniaさん
確かにその方法で並びそうですね。ただ、今回は直感的に分かりやすい連結で
実装してしまおうと思います。ありがとうございました。


簡単そうで意外と難しいですね。。。
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2006-08-23 14:14
引用:

eterniaさんの書き込み (2006-08-23 14:01) より:
order by で (A+B) ,A 両方の降順に並び替えれば
一番上のレコードが最大値になりませんでしょうか?




私もそれを考えたのですが
検索結果が複数行になることを想定すると
取得結果を再編集しないといけないのは
どうかな、と思いました。

あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-08-23 16:56
引用:

あすかさんの書き込み (2006-08-23 14:14) より:
検索結果が複数行になることを想定すると
取得結果を再編集しないといけないのは
どうかな、と思いました。


DBの種類がはっきりすれば問題ないのでは?
例えば、Oracleならrownum擬似列、PostgreSQLならlimitで制限できますよ。

スキルアップ/キャリアアップ(JOB@IT)