sql >> データベース >  >> RDS >> Oracle

SQLクエリ複数のランク/グループから最初のランク1行を選択します

    分析関数で注文する多くの条件を指定できます

    SELECT *
      FROM (SELECT id,
                   col1,
                   col2,
                   col3,
                   dense_rank() over (partition by id
                                          order by (case when col1 = 'xyz' 
                                                         then 1 
                                                         else 0 
                                                     end) desc,
                                                   col2 asc,
                                                   col3 asc) rnk
              FROM your_table)
     WHERE rnk = 1
    

    dense_rankが必要だと思います dense_rankを使用した場合 鬼ごっこ。ネクタイをどのように処理したいか、またはネクタイが可能かどうかについては話しません。そのため、rankを使用するかどうかは質問自体からは明確ではありません。 、dense_rank 、またはrow_number 分析関数。 idごとに最高ランクの行のみをフェッチしている場合 、rank およびdense_rank 同じように動作し、最初の場所に同点がある場合は複数の行を返します。 row_number ネクタイを任意に解除することにより、常に単一の行を返します。 idごとに最初の行以外の行をフェッチする場合 、次に、同点について考える必要があり、rankとは異なる動作が得られます およびdense_rank 。 2つの行が最初に結び付けられている場合、dense_rank 3番目の行にrnkを割り当てます rankの間に2の rnkを割り当てます の3。

    これは、投稿したサンプルデータで機能するようです

    SQL> ed
    Wrote file afiedt.buf
    
      1  with x as (
      2  select 1 id, 'abc' col1, to_date('01/01/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
      3  select 1 id, 'abc' col1, to_date('01/01/2012', 'MM/DD/YYYY') col2, 'A' col3 from dual union all
      4  select 2 id, 'abc' col1, to_date('01/01/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
      5  select 2 id, 'abc' col1, to_date('01/02/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
      6  select 3 id, 'abc' col1, to_date('01/02/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
      7  select 3 id, 'xyz' col1, to_date('01/01/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
      8  select 4 id, 'abc' col1, to_date('01/02/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
      9  select 4 id, 'xyz' col1, to_date('01/01/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
     10  select 4 id, 'xyz' col1, to_date('01/02/2012', 'MM/DD/YYYY') col2, null col3 from dual
     11  )
     12  SELECT *
     13    FROM (SELECT id,
     14                 col1,
     15                 col2,
     16                 col3,
     17                 dense_rank() over (partition by id
     18                                        order by (case when col1 = 'xyz'
     19                                                       then 1
     20                                                       else 0
     21                                                   end) desc,
     22                                                 col2 asc,
     23                                                 col3 asc) rnk
     24            FROM x)
     25*  WHERE rnk = 1
    SQL> /
    
            ID COL COL2      C        RNK
    ---------- --- --------- - ----------
             1 abc 01-JAN-12 A          1
             2 abc 01-JAN-12            1
             3 xyz 01-JAN-12            1
             4 xyz 01-JAN-12            1
    


    1. spring / hibernateで使用するmysqlドライバーは何ですか?

    2. 配列要素にアクセスする方法

    3. GROUP BYを使用すると、MYSQLに誤った行が表示される

    4. PHPSQLServerの出力パラメーター