- ベストアンサー
ORACLE SQLで複数項目の最大抽出方法
- Oracle 10gを使用している場合、特定の条件で複数の項目の最大値を抽出する方法を知りたいです。
- 例えば、データテーブルの複数の項目の中から、キーとなる項目の値が最大であるレコードを取得したい場合、どのようなSQLを使えば良いでしょうか。
- 具体的な例として、A列をキーとして、B列(年)、C列(月)、D列(日)の値が最新のレコードを抽出したいと思っています。どのようなクエリを使用すれば良いでしょうか。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
カラム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 ) / ですかね
その他の回答 (3)
- nora1962
- ベストアンサー率60% (431/717)
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;
補足
ご回答ありがとうございます。 実行したところ、ORA-00904エラーとなってしまい 1行目のselectあとにABCDを指定できませんでした。 *で実行したところ rn -------------- 1 1 1 : : という結果でした。
- wpwpwpwpw
- ベストアンサー率50% (1/2)
手元に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でくくってください
お礼
回答ありがとございました。
- 原沢 信道(@nharasawa)
- ベストアンサー率53% (90/168)
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 はどうでしょうか。
お礼
回答ありがとございました。
お礼
ご回答ありがとうございました。 こちらのクエリで解決することができました。