ORACLE SQLで複数項目の最大抽出方法

このQ&Aのポイント
  • Oracle 10gを使用している場合、特定の条件で複数の項目の最大値を抽出する方法を知りたいです。
  • 例えば、データテーブルの複数の項目の中から、キーとなる項目の値が最大であるレコードを取得したい場合、どのようなSQLを使えば良いでしょうか。
  • 具体的な例として、A列をキーとして、B列(年)、C列(月)、D列(日)の値が最新のレコードを抽出したいと思っています。どのようなクエリを使用すれば良いでしょうか。
回答を見る
  • ベストアンサー

ORACLE SQL 複数項目の最大抽出

はじめまして 当方、初心者で勉強の身です。ご回答頂けたら幸いです。 Oracle10gを使っています。 表1 カラムA(PK) CHAR型 カラムB(PK) CHAR型 カラムC(PK) CHAR型 カラムD(PK) CHAR型 A     B     C     D --------------------------------- AUD   2012   1      30 AUD   2011   12     26 EUR   2010   7      1 EUR   2011   6     21 EUR   2012   5      1 JPY   2011   6     26 JPY   2011   12     25 というデータであれば A     B     C     D --------------------------------- AUD   2012   1      30 EUR   2012   5      1 JPY   2011   12     25 というデータを抽出したいと考えています。 具体的には、Aをキーにして、B(年)、C(月)、D(日)の年月日の最新日付を取りたいですが どうすればよいでしょうか。 お手数をおかけしますが、よろしくお願い致します。

  • c_gen
  • お礼率79% (19/24)
  • Oracle
  • 回答数4
  • ありがとう数3

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

  • ベストアンサー
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

カラムB~カラムDがCHARなのがちと面倒ですね。 select カラムA, カラムB, カラムC, カラムD from 表1 where (カラムA, カラムB||right('0'||rtrim(カラムC), 2)||right('0'||rtrim(カラムD), 2)) in (  select カラムA, max(カラムB||right('0'||rtrim(カラムC), 2)||right('0'||rtrim(カラムD), 2))  from 表1  group by カラムA ) / ですかね

c_gen
質問者

お礼

ご回答ありがとうございました。 こちらのクエリで解決することができました。

その他の回答 (3)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.4

select A,B,C,C from ( select *, row_number() over (partition by A order by to_number(B) desc ,to_number(C) desc, to_number(D) desc ) rn from テーブル名 ) where rn = 1;

c_gen
質問者

補足

ご回答ありがとうございます。 実行したところ、ORA-00904エラーとなってしまい 1行目のselectあとにABCDを指定できませんでした。 *で実行したところ rn -------------- 1 1 1 : : という結果でした。

回答No.3

手元にmysqlでのみ検証できるので試してみました。 oracleではsubstrをsubstrに副クエリのB,C,Dはto_number関数でくくる必要があります。 select A, substring(F, 1, 4) B, substring(F, 5, 2) * 1 C, substring(F, 7, 2) * 1 D from (select A, max(E) F from (select A , B * 10000 + C * 100 + D E from test.t1) T2 group by A) T3 なお、結果のC,Dは数字になっているので、必要に応じてto_charでくくってください

c_gen
質問者

お礼

回答ありがとございました。

回答No.2

SELECT A,B,C,D FROM テーブル名 WHERE (A||B ||CASE LENGTH(RTRIM(C)) WHEN 1 THEN '0'||C ELSE C END ||CASE LENGTH(RTRIM(D)) WHEN 1 THEN '0'||D ELSE D END) IN(SELECT A||MAX(B ||CASE LENGTH(RTRIM(C)) WHEN 1 THEN '0'||C ELSE C END ||CASE LENGTH(RTRIM(D)) WHEN 1 THEN '0'||D ELSE D END) FROM テーブル名 GROUP BY A) ORDER BY 1 はどうでしょうか。

c_gen
質問者

お礼

回答ありがとございました。

関連するQ&A

  • updateで複数行更新したい

    OracleのSQLについて質問があります。 UPDATE文を1度しか使わずに、抽出条件の異なるデータを複数個更新することは可能ですが? 例えば、 テーブル名:TEST カラム: A B C D UPDATE A B C D 100 010 350 300 → 100 010 200 250 100 020 350 000 → 100 020 200 280 という感じで更新したいのですが、どんなUPDATE文を組み立てればいいのか思いつきません。 なので、何かきっかけになるようなことでも構いませんので、教えてください。 よろしくお願いします。

  • SQL について教えて下さい

    ---------------------------------------- テーブルAの カラム1、カラム2のデータが 10、作業A 20、作業B 30、作業C ---------------------------------------- テーブルBの カラム1、カラム2のデータが 10、2013/1/1 10、2013/2/1 20、1999/1/1 20、1999/2/1 ---------------------------------------- のようなデータがあります テーブルA、テーブルBのカラム1はリレーションです この2のテーブルから、テーブルBの最新日付の カラム1のグループ毎に選択するSQLを教えて下さい ---------------------------------------- 結果 10、作業A、2013/2/1 20、作業B、1999/2/1 ---------------------------------------- select テーブルA.カラム1,テーブルA.カラム2,テーブルB.カラム2 で、条件をどうしたら、テーブルBの最新日付を取り出せますか

  • 異なるDBから、それぞれ複数の抽出データを並べたい

    大変恐れ入ります。過去の他の方の質問を一部引用しております。 <引用:2009/11/05 QNo.5425095> ---引用--- excel関数を用いてある行の範囲内の数値のみを違う行に抽出し、同じ列に対応する値も引っ張ってくることは可能ですか?     A   B   C   D 1   33   180 2   58   300 3   89   310 4   152   240 5   205   74 -------------------------------------------------- この質問に関しての回答は理解できましたが、1つ質問と、さらに応用編としてご口授いただきたくお願いいたします。 Q1. 上記にあるA1の”33”を、A1以外のセルにセットするとC,Dに正規のデータが抽出されない。    この際、    ・ =IF(AND(A1>=60,A1<=180),ROW(A1),"")    ・ =IF(OR(ROW(A1)>COUNT($C:$C),COLUMN(A1)>2),"",INDEX($A:$B,SMALL($C:$C,ROW     (A1)),COLUMN(A1)))    の抽出範囲も設定をしてみましたが、全く結果が得られません。必ずA1にデータがないとだ    めなのでしょうか。    もし可能であれば、その応用として下記の内容を検討しており、非常に苦戦しております。    是非教えていただければと思いますので、よろしくお願いします。    》上記サンプルの様なシートが2つ存在し、それを一枚のシートにまとめ、2つのデータベース     からそれぞれに対し異なる抽出条件を提示し、その結果一覧をそれぞれ表示したいと検討     しております。    大変申し訳ないのですが、少々急いでおります。是非よろしくお願いいたします。

  • 必要なデータを抽出したい

    必要なデータを抽出したい    A   B    C   D ・・・ 1 7/1   101   102  103 2 7/2   101   103 3 7/3   105   203 4 7/4   103   205 5 7/5   101   202 ・ ・    ・ ・ ・    ・ ・ ・    ・ Excelで上の様にA列に日付、B行列以降に数字が書かれているシートから、抽出したい数字が含まれている行を別シートに抽出するマクロはどのように書けばよろしいのでしょうか。 技術者の方、よろしくお願いします。 例えば、101が含まれているデータを抽出したら、sheet2に    A   B    C   D 1 7/1   101   102  103 2 7/2   101   103 3 7/5   101   202 となるようにしたいのです。

  • oracle sqlについて

    お世話になります。 Oracle Sqlでの質問を致します。 Oracleのデータで重複データを削除したく 下記の構文を書いたのですが、 右括弧がありませんと言うエラーが出てしまいます。 見た目括弧はちゃんとあると思うのですが、 どこが悪いのか分かりません。 ご親切な方、ご教示くださいます様、 宜しくお願いいたします。          記 DELETE FROM D入庫データ WHERE ID NOT IN ( SELECT MIN(ID) FROM D入庫データ GROUP BY PPID,台車番号,入庫数量,ロット番号,TO_CHAR(登録日時,'yyyy,mm,dd') WHERE TO_CHAR(SYSDATE,'yyyy/mm/dd)=TO_CHAR(登録日時,'yyyy/mm/dd') );

  • 月間集計ですべての日付を抽出するには

    Oracle9iで開発をしております。 月間集計をするにあたり、SQLをどのように書けばよいのか質問させていただきたいと思います。 たとえば、COUNTテーブルというテーブルがあり 年月日 カウント数 2005/09/01 1000 2005/09/01 1000 2005/09/02 2000 2005/09/03 3000 2005/09/05 5000 2005/09/06 6000 というようにデータが入っていたとします。 現在、 SELECT 年月日, SUM(カウント数) FROM COUNTテーブル WHERE COUNT_DATE BETWEEN TO_DATE(to_char(?||'/'||?||'/01')) AND LAST_DAY(TO_DATE(to_char(?||'/'||?||'/01'))) GROUP BY 年月日 としていまして、抽出されるデータは 2005/09/01 2000 2005/09/02 2000 2005/09/03 3000 2005/09/05 5000 2005/09/06 6000 となります。 ここで、2004/09/04や2005/09/07以降2005/09/30までのテーブルには存在 しない日付も抽出したいと思っています。 どのようにすれば抽出できるのでしょうか?

  • SQL文 特定のレコードを抽出したい

    以下のようなテーブルAがあったとします。 年月日,項目B ---------------------- 20080101 100 20080102 100 20080103 200 20080104 400 20080105 400 20080106 200 SQL文にて、データの抽出を行いたいのですが、 抽出したいのは、データに変更があった年月日と項目Bの値です。 年月日,項目B ---------------------- 20080101 100 20080103 200 20080104 400 20080106 200 前の年月日と比較し、項目Bに違いがあった場合のデータだけ抽出したいのですが、SQL文で行うことは可能でしょうか?? 環境は、SQL Server 2005 です。

  • Oracleのプロシージャについて

    Oracleのプロシージャについて教えてください。 現在、Aテーブル(カラム1、カラム2、カラム3、カラム4):件数40万件     Bテーブル(カラムA、カラムB、カラムC):件数50件 と言うテーブルがあります。 この中でデータ置換を行う必要があり、 Aテーブルのカラム2とBテーブルのカラムBが一致したらAテーブルの カラム3にBテーブルのカラムCで更新するプロシージャを作成しています。 通常のUpdate文で3000件単位でCommitを切るようにしていますが時間がかかります。 皆さんはこういう場合どういう手法でやられていますか? ご教授ください。 ちなみに、 サーバOS:Windows2008SERVER クライアントOS:Windows7 Oracle11 です。

  • SQL 繰り返し項目を表示

    以下の条件 カラム「C1」が主キーのテーブルがAとB↓ テーブルA C1| --- AA| テーブルB C1|C2| -----| AA|11| AA|22| AA|33| とあった場合に、抽出結果を C1|C2 | ---------| AA|112233| にするためにはどのようなSQLを組めばいいのでしょうか?

    • ベストアンサー
    • MySQL
  • EXECL・複数タブからのデータ抽出

    同一Book内での処理です。 今現在の処理内容です タブAには抽出されるデータがあります。 セルA1・・・抽出キー セルB1・・・抽出データ1 セルC1・・・抽出データ2 タブBには抽出キー・抽出結果を表示するようにしています。 セルA1・・・抽出キー1 セルB1・・・抽出キー2 セルC1・・・抽出キーを合成 <=CONCATENATE(A1,"→",B1)> セルD1・・・データ抽出 <=VLOOKUP(C1,タブA!$A:$C,2,FALSE)> したいことは タブAのデータと同一内容のデータが複数タブに存在するときのデータ抽出する場合はどうすればよいのでしょうか? タブA(リンゴ)には抽出されるデータがあります。 セルA1・・・抽出キー セルB1・・・抽出データ1 セルC1・・・抽出データ2 タブB(みかん)には抽出されるデータがあります。 セルA1・・・抽出キー セルB1・・・抽出データ1 セルC1・・・抽出データ2 タブCではセルA1の内容によって抽出するデータのタブを選択しデータを抽出したい セルA1・・・抽出キー1 セルB1・・・抽出キー2 セルC1・・・抽出キーを合成 <=CONCATENATE(A1,"→",B1)> セルD1・・・データ抽出 <=ここの計算式が知りたい タブCのセルA1の抽出キーに(リンゴ)と入力されていればタブA(リンゴ)のシートよりデータ抽出 タブCのセルA1の抽出キーに(みかん)と入力されていればタブB(みかん)のシートよりデータ抽出 単にいえば、データ抽出するタブを指定して<VLOOKUP関数>を利用できるのか? できないなら実現できる手法を教えていただきたいです。 説明が難しいですが、内容がわかっていただけたでしょうか? 達人からの回答よろしくお願いいたします