- ベストアンサー
同行内の最大値
毎度お世話になります。以下の件で解かる方いらっしゃいましたら教えてください。 現在、以下のようなテーブルがあるとします。 ID | DATA1 | DATA2 | DATA3 1 | 100 | 200 | 300 2 | 250 | 350 | 100 3 | 400 | 100 | 200 これより、行毎にDATA1からDATA3までの範囲内での最大値を取得したいのですが、それは可能でしょうか? 以下のような感じで取得したいのです。 ID | 最大値 1 | 300 2 | 350 3 | 400 列の最大値ならMAXを使えばいいのでしょうが、同行内最大値となるとどのように書けば良いか検討が付きません。 スマートな方法があれば、ご教示お願いします。 環境は SQL Server 2005です。宜しくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
SELECT ID, fld_1 as 最大値 FROM TAB1 WHERE fld_1 > fld_2 AND fld_1 > fld_3 UNION SELECT ID, fld_2 as 最大値 FROM TAB1 WHERE fld_2 > fld_1 AND fld_2 > fld_3 UNION SELECT ID, fld_3 as 最大値 FROM TAB1 WHERE fld_3 > fld_1 AND fld_3 > fld_2 実行結果 ID|__最大値| ------------ __1|____300| __2|____350| __3|____400| ※ただし、 SQL Server 2000。 ※ただし、基本文しか使っていないので多分・・・。
その他の回答 (1)
- ann_dv
- ベストアンサー率43% (528/1223)
データ列数が3つのみであれば、No.1の回答が最適かと思いますが、 実際にはもっと多数の列が存在するようであれば、IDとDATA列のみ の別テーブルを作成した方がよろしいかと思います。 既存テーブルをTable1,新しいテーブルをTable2とした場合の例: insert into Table2 (ID,DATA) select ID , DATA1 from Table1 insert into Table2 (ID,DATA) select ID , DATA2 from Table1 insert into Table2 (ID,DATA) select ID , DATA3 from Table1 ・ ・ Table2からのクエリ例: declare @i int set @i = 1 while (select max(ID) from Table2) >= @i begin select ID ,DATA from Table2 where DATA= (select max(data) from Table2 where ID=@i) set @i = @i + 1 end
お礼
そうです、実際比較したいカラムは3行より多いです。 繰り返し部分を正規化してテーブルを分割できればMAXが使えるので楽なのですが、レコード数が膨大になってしまうので難しいところです。 またテーブルを増やすと、データの追加や削除をしているプログラム部分も手を加えなければいけなくなるので、ちょっと厳しいですね。 というわけで、今回はNo.1さんのやり方の方で検討してみたいと思います。 アドバイスどうもありがとうございました。
お礼
あ、なるほど、UNION。 無理に一度にとろうとせず、DATA1が最大値となるとき、DATA2が最大値となるとき…といった感じで個別にとれば楽ですね。 CASE等つかって、強引に一気に取得しようとして頭がこんがらがった次第でございます(笑)。 この方法で検討したいと思います、ありがとうございました。