人気ブログランキング | 話題のタグを見る
<< 【NEWS】2歳までのテレビ控... 【NEWS】Macの社長がMc... >>

複数カラムの最大値を取得するSQL



今日仕事で、DBからデータを検索しなくちゃいけなかったん
だけど、複数のカラムのうち最大の値を取得するのを1本のSQL
で簡単に出来ないかな?って考えた。

簡単な例でいくと、カラム col_a, col_b, col_c とある
tableがあって



col_a col_b col_c
----- ------ ------
4 2 1
1 5 0
1 1 0


だとする。
これを1本のSQLで、各Row毎のcol_a, col_b, col_c の
最大値をとりたい。
期待する結果はこんな感じ。


4
5
1



Excelだと =max(a1,b1,c1) みたいに簡単。

私はSybaseを使っているので、


select
case when col_a >= col_b then
case when col_c >= col_a then col_c
else col_a
end
else case when col_c >= col_b then col_c
else col_b
end
end
from table_x



こうなるのかな?
ここで検査するカラムの数が3個ならいいけど、10個だとキツイ。
Stored Procedureかなんか作って、Loopでまわすしかないのかな?

結局、Excelにデータを落して Excelの関数でやりましたけど‥
by crab2003 | 2004-02-06 19:43 | 仕事・会社のこと | Comments(6)
Commented by blue-marlin at 2004-03-04 18:31
非常に亀なレスですが・・・こんな感じでいかがでしょう?
select max(x1.col_a) col_a, max(x2.col_b) col_b, max(x3.col_c) col_c from table_x x1, table_x x2, table_x x3
Commented by crab2003 at 2004-03-05 12:32
レスありがとうございます。

私の説明と例が悪くて結果が同じようになってしまいましたが、求めたい結果は、それぞれのrowのcol_a,col_b,col_c のうち一番大きな数字を求めたいのです。

blue-marlin さんんのSQL文だと、全rowでcol_aの最大値、col_bの
最大値、col_cの最大値を求める文ですよね。

これにレスがついて嬉しいです(^^)
Commented by blue-marlin at 2004-03-05 14:01
ああ、なんとお恥ずかしい。完全に読み違えました。。。

自分ならPerl scriptからDBIで1件ずつ取り出して配列に入れ、arsortかけて先頭を取るとかしちゃうような気がします。カラムの数には左右されないし、Stored Procedureよりは簡単に書けるかと。かなり力技っぽいですが。。。
Commented by sqler at 2004-07-21 02:08 x
こんにちは~。

Crabさんと同業種・若手でございます。

後輩にいかがですか?

下記は、忘れたころにやってくる、激亀レスでごわす。

無理してSQLで書きました!

間違えてたらはげしくすみませぬ~。

■テーブル作成
create table table_x (primary_key number, col_a number, col_b number, col_c number);

■テストデータ挿入
insert into table_x values (0, 4, 2, 1);

insert into table_x values (1, 1, 5, 0);

insert into table_x values (2, 1, 1, 0);

※都合上ユニークキー(primary_key)が必要でした!
Commented by sqler at 2004-07-21 02:09 x
■クエリ実行
select * from
(select
key,max(col_a) max_value
from
table_x
group by
key
having
max(col_a)>=max(col_b) and
max(col_a)>=max(col_c)
)
union
(select
key,max(col_b) max_value
from
table_x
group by
key
having
max(col_b)>=max(col_a) and
max(col_b)>=max(col_c)
)
union
(select
key,max(col_c) max_value
from
table_x
group by
key
having
max(col_c)>=max(col_a) and
max(col_c)>=max(col_b)
)order by key;

■クリーンアップ
drop table table_x;
Commented by crab2003 at 2004-07-21 09:15
★sqlerさん、
コメントありとうございます。
うちの会社に来ませんか?(笑)

試してみました。これでもいけそうですね。
ありがとうございます。
まぁ、SQLは横の検索に弱いことがわかりました。
ありそうでないんですよね~こういう関数。

Oracleの場合はDECODE関数でやるとスッキリするのかな。
やっぱりmax(col_a,col_b,col_c,col_d,...)という関数があればいいのに‥
<< 【NEWS】2歳までのテレビ控... 【NEWS】Macの社長がMc... >>