Oracle
 sql >> Datenbank >  >> RDS >> Oracle

SQL-Abfrage Erste Reihe 1 Zeile aus mehreren Reihen/Gruppe auswählen

Sie können in Ihrer Analysefunktion viele Bedingungen angeben, nach denen sortiert werden soll

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

Ich gehe davon aus, dass Sie dense_rank wollen vorausgesetzt, Sie haben den dense_rank verwendet Schild. Sie sprechen nicht darüber, wie Sie mit Unentschieden umgehen möchten oder ob Unentschieden überhaupt möglich sind, daher geht aus der Frage selbst nicht hervor, ob Sie den rank verwenden möchten , dense_rank , oder row_number analytische Funktionen. Wenn Sie immer nur die Zeile mit dem höchsten Rang pro id abrufen , rank und dense_rank verhält sich identisch und gibt mehrere Zeilen zurück, wenn es Unentschieden für den ersten Platz gibt. row_number wird immer eine einzelne Zeile zurückgeben, indem die Bindung willkürlich gebrochen wird. Wenn Sie andere Zeilen als die erste Zeile pro id abrufen möchten , dann müssen Sie über Bindungen nachdenken und Sie werden ein anderes Verhalten von rank erhalten und dense_rank . Wenn zwei Zeilen für die erste gleich sind, dense_rank weist der dritten Zeile einen rnk zu von 2 während rank weist ihm einen rnk zu von 3.

Dies scheint für die von Ihnen geposteten Beispieldaten zu funktionieren

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