質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

659閲覧

コードごとの最大値が含まれたレコードの抽出

hj_zebra

総合スコア10

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2020/01/21 00:22

編集2020/01/21 00:47

前提・実現したいこと

revごとのrev2の降順・rev3の降順をおこなった一番目のレコードを抽出したいです。
エクセルの関数や機能でできますでしょうか。
いろいろ触ってみましたが、結局できなかったです。
なるべくエクセルでやりたいのですがsqlでもいいのでご教示ください。
DB:oracle
バージョン:12.1.0.2.0

テストcsv

id,rev,rev2,rev3 1,100,30,10 2,100,20,20 3,100,20,15 4,200,10,10 5,200,10,20 6,300,30,30 7,300,30,20 8,400,10,10

抽出したい内容

id,rev,rev2,rev3 1,100,30,10 5,200,10,20 6,300,30,30 8,400,10,10

試したこと

select TA.id, TA.rev, TB.MAXrev2, TC.MAXrev3 from TableA as TA INNER JOIN ( select rev, MAX(rev2) AS MAXrev2 from TableA group by id, rev ) as TB ON TA.rev = TB.rev AND TA.rev2 = TB.MAXrev2 INNER JOIN ( select rev, MAX(rev3) AS MAXrev3 from TableA group by id, rev ) as TC ON TA.rev = TC.rev AND TA.rev3 = TC.MAXrev3 group by rev ```  これだとid:1.4.6.8が抽出でき4がおかしい状態です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toyotaku

2020/01/21 00:45 編集

データベース製品名とバージョンを追記されると回答が得やすいかと思います。 また、要件を見る限り、下記の結果になるべきと考えます。 ID,rev,rev2,rev3 5,200,10,20 6,300,30,30 8,400,10,10 要件の「codeごとの」というのはrevごとの、という意味であろうと推察しますが、 抽出したい内容のid1は、rev2の降順では1番目ですが、 rev3の降順では1番目ではありません。 改めて要件を整理して頂くと、あるいはご自分で解決できるかもしれません。
hj_zebra

2020/01/21 00:49

>toyotakuさん DB名記述しておきました。 そこがわからない部分ですが、もう少し考えてみます。
guest

回答3

0

解決済みですけど、分析関数を使用した方が高速のように思えるので回答しておきます。

SQL

1select * 2from TableA 3where (rev, rev2, rev3) in ( 4 select rev, max(rev2) over(partition by rev), max(rev3) over(partition by rev, rev2) 5 from TableA 6 group by rev 7 )

追記

上記は手打ちだったので確認したらエラーでした。
エラー回避する記述が思いつかなかったので、分析関数使用しない別パターンを取り敢えず回答しておきます。

SQL

1select * 2from TableA 3where (rev, rev2, rev3) in ( 4 select rev, rev2, max(rev3) 5 from tablea 6 where (rev, rev2) in ( 7 select rev, max(rev2) 8 from TableA 9 group by rev 10 ) 11 group by rev, rev2 12 )

投稿2020/01/21 05:06

編集2020/01/21 15:01
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2020/01/21 06:09

シンプルで良いですね。
guest

0

ベストアンサー

エクセルだと難しそうですね、SQLでいいなら

投稿2020/01/21 00:46

yambejp

総合スコア114583

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/01/21 00:46

create table tbl(id int primary key,rev int,rev2 int,rev3 int); insert into tbl values (1,100,30,10), (2,100,20,20), (3,100,20,15), (4,200,10,10), (5,200,10,20), (6,300,30,30), (7,300,30,20), (8,400,10,10);
yambejp

2020/01/21 00:46

select * from tbl as t1 where not exists ( select 1 from tbl where rev=t1.rev and (rev2>t1.rev2 or rev2=t1.rev2 and rev3>t1.rev3) )
hj_zebra

2020/01/21 01:00

>yambejpさん 回答ありがとうございます。 とても助かりました。構文などを理解してから使用したいと思います。
Orlofsky

2020/01/21 02:48

OracleではこのINSERTはエラーになります。 SQL> insert into tbl values 2 (1,100,30,10), 3 (2,100,20,20), 4 (3,100,20,15), 5 (4,200,10,10), 6 (5,200,10,20), 7 (6,300,30,30), 8 (7,300,30,20), 9 (8,400,10,10); (1,100,30,10), * 行2でエラーが発生しました。: ORA-00933: SQLコマンドが正しく終了されていません。
yambejp

2020/01/21 02:49

insertはサンプルなので適宜よみかえてください 原則mysqlのバルクインサートを想定しています
yambejp

2020/01/21 03:43

ああ今見たらたしかに質問文にoracleって書いてありましたね タグにないから気が付きませんでした。 ちなみにoracleで実行する気はさらさらありません
hj_zebra

2020/01/21 03:46

oracleと書きましたが どちらでも実行するのはできますので大丈夫です。 こちらの質問が悪かったですね。 申し訳ないです。
Orlofsky

2020/01/21 03:52

hj_zebraさんは質問に[Oracle]タグを追加してください。
guest

0

下記のSQLでどうでしょう。

sql

1SELECT 2 TableA.* 3FROM 4 TableA 5 INNER JOIN ( 6 SELECT 7 TableA.rev, 8 TableA.rev2, 9 Max(TableA.rev3) AS MAXrev3 10 FROM 11 ( 12 SELECT 13 rev, 14 Max(rev2) AS MAXrev2 15 FROM 16 TableA 17 GROUP BY 18 rev 19 ) Q1 20 INNER JOIN TableA ON (Q1.MAXrev2 = TableA.rev2) 21 AND (Q1.rev = TableA.rev) 22 GROUP BY 23 TableA.rev, 24 TableA.rev2 25 ) Q2 ON TableA.rev3 = Q2.MAXrev3 26 AND TableA.rev2 = Q2.rev2 27 AND TableA.rev = Q2.rev;

あるいは、

sql

1SELECT 2 T1.* 3FROM 4 TableA T1 5WHERE 6 T1.id= 7 (SELECT TOP 1 id 8 FROM TableA 9 WHERE rev=T1.rev 10 ORDER BY rev2 DESC, rev3 DESC);

投稿2020/01/21 01:22

編集2020/01/21 01:37
hatena19

総合スコア33620

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問