sql >> Database >  >> RDS >> Oracle

SQL Query Selecteer eerste rang 1 rij Van Meerdere rangen/Groep

U kunt in uw analytische functie veel voorwaarden opgeven om te bestellen

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

Ik neem aan dat je dense_rank . wilt aangezien je de dense_rank . hebt gebruikt label. Je praat niet over hoe je met banden wilt omgaan of dat banden überhaupt mogelijk zijn, dus uit de vraag zelf wordt niet duidelijk of je de rank wilt gebruiken , dense_rank , of row_number analytische functies. Als u alleen de hoogste rij per id . ophaalt , rank en dense_rank zal zich identiek gedragen en zal meerdere rijen retourneren als er banden zijn voor de eerste plaats. row_number zal altijd een enkele rij retourneren door de gelijkspel willekeurig te verbreken. Als u andere rijen wilt ophalen dan de eerste rij per id , dan moet je nadenken over banden en krijg je ander gedrag dan rank en dense_rank . Als twee rijen gelijk zijn voor de eerste, dense_rank zal de derde rij een rnk toewijzen van 2 terwijl rank zal het een rnk toewijzen van 3.

Dit lijkt te werken voor de voorbeeldgegevens die je hebt gepost

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. MySQL consolideert dubbele gegevensrecords via UPDATE / DELETE

  2. Vastgelopen in fout 2 met mysql met XAMPP

  3. Hoe te om Kolom, * VAN DE TABEL in Oracle te SELECTEREN?

  4. Retourneer de korte dagnaam van een datum in Oracle