• ベストアンサー

同行内の最大値

毎度お世話になります。以下の件で解かる方いらっしゃいましたら教えてください。 現在、以下のようなテーブルがあるとします。 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です。宜しくお願いします。

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

  • ベストアンサー
noname#140971
noname#140971
回答No.1

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。 ※ただし、基本文しか使っていないので多分・・・。

NYOI
質問者

お礼

あ、なるほど、UNION。 無理に一度にとろうとせず、DATA1が最大値となるとき、DATA2が最大値となるとき…といった感じで個別にとれば楽ですね。 CASE等つかって、強引に一気に取得しようとして頭がこんがらがった次第でございます(笑)。 この方法で検討したいと思います、ありがとうございました。

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

その他の回答 (1)

  • ann_dv
  • ベストアンサー率43% (528/1223)
回答No.2

データ列数が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

NYOI
質問者

お礼

そうです、実際比較したいカラムは3行より多いです。 繰り返し部分を正規化してテーブルを分割できればMAXが使えるので楽なのですが、レコード数が膨大になってしまうので難しいところです。 またテーブルを増やすと、データの追加や削除をしているプログラム部分も手を加えなければいけなくなるので、ちょっと厳しいですね。 というわけで、今回はNo.1さんのやり方の方で検討してみたいと思います。 アドバイスどうもありがとうございました。

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

関連するQ&A

  • 日付の最大値レコードを取得する方法について

    お世話になります。 SQLで日付の最大値を取得する方法です。 テーブルのデータ内容は以下のようになっています。 | 社員番号 | 社員名 | 日付 | 順序 | +---------+-------+-----------+-----+ | 100 | AAA | 2011/05/01 | 2 |   ← このレコードを取得したい +---------+-------+-----------+-----+ | 100 | AAA | 2011/05/01 | 1 | +---------+-------+-----------+-----+ | 100 | AAA | 2011/04/01 | 1 | +---------+-------+-----------+-----+ | 200 | BBB | 2011/04/01 | 2 |   ← このレコードを取得したい +---------+-------+-----------+-----+ | 200 | BBB | 2011/04/01 | 1 | +---------+-------+-----------+-----+ 取得したいレコードは、 社員ごとの最大日付の最大順序をもつレコードです。 (上記の1行目と4行目のレコードを取得したい) この場合、 下記のようなSQLを考えます。 --------------------------------- SELECT 社員番号, 社員名, 日付 FROM テーブル名 WHERE 社員番号 = 'xxx' AND 日付 = (SELECT MAX(日付) FROM テーブル名 ) AND 順序 = (SELECT MAX(順序) FROM テーブル名 ) ---------------------------------- 但し、上記の場合、 社員ごとに最大値レコードが取得できません。 どなたかレコード取得方法について 教えていただけないでしょうか? よろしくお願いいたします。

  • 最大バイト数を調べるSQL文を教えてください

    SQL初心者です。 初歩的なSelect文だと思うのですが、 以下のSQLの書き方を教えてください。 「テーブルAの列Bに入っている文字列のバイト数のうち、  最大のバイト数の値を返すSQL」 バイト数をすべて取得するのであれば SELECT LENGTHB(B) FROM A になるかと思うのですが、最大のものを 求める書き方がわかりません。 よろしくお願いします。

  • Oracle:グループごとに最大日付の行を1件取得

    Oracle11gで、以下のようなテーブルから、 「IDごとに、DTが最大のレコードのBUMONを1件ずつ取得」 したいです。 <テーブルTB> ID DT BUMON ------------- 1 9/1 A 1 9/2 A 1 9/3 B ★Bを取得したい 2 9/4 C 2 9/5 C ★Cを取得したい 3 9/1 D 3 9/3 E 3 9/3 E ★Eを取得したい <取得したいデータ> BUMON ------- B C E <考えたSQL> select distinct A.BUMON from (select ID, DT, max(DT) over(partition by ID) as MAXDT, BUMON from TB) A, (select ID, DT, max(DT) over(partition by ID) as MAXDT, BUMON from TB) B where A.ID = B.ID and A.DT = B.MAXDT ; 上記のような方法を考えましたが、取得できますでしょうか? 現在、SQL実行環境がない場所にいるのですが、急ぎで確認したく、 どなたかお知恵を拝借できませんでしょうか?? また、可能であれば、★のレコード全体を取得するSQLもご教授いただきたく存じます。 <★のレコード全体を取得した結果> ID DT BUMON ------------- 1 9/3 B 2 9/5 C 3 9/3 E

  • 一定以上の行があれば最大値を持つ行を削除するSQL

    MySQL5にて、あるテーブルの特定フィールドの数(つまりcount値)が一定値以上であれば、間引きのため別のフィールドの値で最大値をもつ行を削除するSQLを考案中です。 イメージとしては以下の通りですが、SQLとしては誤っており、また、冗長です。 DELETE FROM table WHERE id={$id} AND (SELECT COUNT(*) FROM table WHERE id={$id}) > 5 AND begin = (SELECT MAX(begin) FROM table WHERE id={$id}); よい知恵をお授けください。

    • ベストアンサー
    • MySQL
  • 最大値の取得

    いつもお世話になっております。 Access2003を使っております。 NEN | TSUKI | COUNT -----+-------+-------   11 |  3   |  2   13 |  2   |  1   11 |  6   |  2   14 |  1   |  3 上記のようなテーブルでNENが最大のものを 取得し、さらにそのなかでTSUKIが最大のものを 取得させたいのですが、一番システムに負荷を かけずにデータを取得できるSQLはどのように 書けばよろしいでしょう? どうかよろしくお願いいたします。

  • Group By を使用して任意のカラムの最大値のデータを取得する。

    Group By を使用して任意のカラムの最大値のデータを取得する。 次のようなテーブルデータがあるとします。   ID    店舗CD    適用日付   A001   101      20100701   A002   101      20100801   A003   101      20100901   B001   102      20100701   B002   102      20100801   B003   102      20100901 抽出イメージですが、このテーブルデータの店舗コードをGroupByして、MAX(適用日付) としたときにIDが取得できなくなります。 なのでGroupByしたときの日付最大値のデータのIDを取得したいのですがいい方法が浮かびません。  同じテーブルデータでGroupBy(店舗コード)、MAX(適用日付)としたサブクエリを(店舗CD=店舗CD)、(適用日付=適用日付)とInnerJoinする方法も考えましたが、万が一、適用日付と店舗CDが同一のものがあった場合、店舗CDが重複してしまいます。  各店舗CDの最大適用日付のID取得したいのです。 なのでイメージはGroupby(店舗CD)とMAX(適用日付)とした時にMAX(適用日付)のIDを取得し、 なおかつ欲をいえば、MAX(適用日付)のIDが複数存在する場合は、1店舗CDにつき一つの適用日付を取得したいです。(この際、IDはなんでもいいです。) 簡単そうなことですごく悩んでいます。 どなたか助けてください。 よろしくお願いします。

  • エクセルで指定範囲の最大値・最小値を求めたい

    エクセルで、A列、B列、C列・・・にそれぞれ100個ずつ数値データがあります。 各列で1番上のデータからn番目のデータまでの範囲の最大値・最小値と、 n+1番目のデータから100番目のデータまでの範囲の最大値・最小値をそれぞれ求めたいのです。 nの値は列ごとに異なっており、例えばA列のn値は[A105]のセルに記入されています。 [A102]=40のとき、 =MAX(A2:A40) =MAX(A41:A101) などと個別に範囲指定をせずに、[A105]の値を引用して最大値・最小値を求めるにはどうすればいいでしょうか。

  • 日時範囲でグループ化された最大値

    任意の時刻にデータをモニタリングしているシステムがあり、データがMS SQL Serverに保存されています。 int ID int DeviceID 端末番号 int DeviceValue 計測値 smalldatetime DeviceTime 日時 これを、任意の日時範囲を指定し、一日単位で集計された、端末ID、計測値の最大値という形式で取得したく思います。 計測日 端末番号 計測最大値 2012/01/01 10002 34543 2012/01/01 10003 33211 2012/01/02 10002 23450 ... ... DBが得意でないため、困っています。 どなたかお助けいただけないでしょうか?

  • テーブル作成時の行数の設定

    はじめまして。 SQL Serber 初心者で、他に聞ける人がいないため質問させていただきます。 環境:SQL Server2000 あるDBのテーブルからINSERT文にて取得したデータをテーブルに保存したいと思い、新規にテーブルを作成したところ、10000行しかデータが入りません。 (実際に取得したデータは、87000行くらいあるのですが、そのうち、10000行しか入らなかったです) 原因がわからず、困っています。 よろしくお願いいたします。

  • ある条件の最大値+1を初番するにはロックが必要ですか?

    以下のテーブルでcolumn毎に連番を振る場合、 テーブルロックが必要でしょうか? テーブル test id column 1 a 2 a 1 b 新規データ登録手順 1.トランザクション 2.select max(id)+1 from test where column = b for update 3.insert test into (id,column) values (selectで取得した値,b) 4.トランザクション終了 これで、column毎に登録されているIDの最大値+1で 重複せずにデータのINSERTが保障されるでしょうか?

    • ベストアンサー
    • MySQL
DCP-J526NのB5印刷設定方法
このQ&Aのポイント
  • DCP-J526NのB5印刷設定方法について詳しく教えてください。
  • お使いのパソコンがWindows10で無線LAN接続されている場合、DCP-J526NのB5印刷設定方法は次の通りです。
  • ひかり回線を使用している場合、DCP-J526NのB5印刷設定方法に注意が必要です。
回答を見る