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

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

ただいまの
回答率

87.78%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 447

score 10

前提・実現したいこと

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がおかしい状態です。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • toyotaku

    2020/01/21 09:42 編集

    データベース製品名とバージョンを追記されると回答が得やすいかと思います。
    また、要件を見る限り、下記の結果になるべきと考えます。
    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 09:49

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

    キャンセル

回答 3

+2

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

select *
from TableA
where (rev, rev2, rev3) in (
        select rev, max(rev2) over(partition by rev), max(rev3) over(partition by rev, rev2)
        from TableA
        group by rev
      )

追記

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

select *
from TableA
where (rev, rev2, rev3) in (
        select rev, rev2, max(rev3)
        from tablea 
        where (rev, rev2) in (
                select rev, max(rev2) 
                from TableA
                group by rev
              ) 
        group by rev, rev2
      )

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/21 15:09

    シンプルで良いですね。

    キャンセル

checkベストアンサー

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/21 12:46

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

    キャンセル

  • 2020/01/21 12:52

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

    キャンセル

  • 2020/01/21 12:54

    同じSQLでもデータベースやそのバージョンによって方言が大きいです。
    SQLの観点から Oracle Database, PostgreSQL, MySQL の特徴を整理しよう! https://www.ashisuto.co.jp/corporate/column/technical-column/detail/1197236_2274.html

    キャンセル

0

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

SELECT
    TableA.*
FROM
    TableA
    INNER JOIN (
        SELECT
            TableA.rev,
            TableA.rev2,
            Max(TableA.rev3) AS MAXrev3
        FROM
            (
                SELECT
                    rev,
                    Max(rev2) AS MAXrev2
                FROM
                    TableA
                GROUP BY
                    rev
            ) Q1
            INNER JOIN TableA ON (Q1.MAXrev2 = TableA.rev2)
            AND (Q1.rev = TableA.rev)
        GROUP BY
            TableA.rev,
            TableA.rev2
    ) Q2 ON TableA.rev3 = Q2.MAXrev3
    AND TableA.rev2 = Q2.rev2
    AND TableA.rev = Q2.rev;

あるいは、

SELECT
    T1.*
FROM
    TableA T1
WHERE
    T1.id=
    (SELECT TOP 1 id
     FROM TableA
     WHERE rev=T1.rev
     ORDER BY rev2 DESC, rev3 DESC);

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る