sql >> Databasteknik >  >> RDS >> Oracle

SQL-fråga Välj första rank 1 rad från flera rankar/grupp

Du kan ange många villkor att beställa efter i din analysfunktion

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

Jag antar att du vill ha dense_rank med tanke på att du använde dense_rank märka. Man pratar inte om hur man vill hantera slips eller om slips ens är möjlig, så det framgår inte av själva frågan om man vill använda rank , dense_rank eller row_number analytiska funktioner. Om du bara någonsin hämtar den högst rankade raden per id , rank och dense_rank kommer att bete sig identiskt och kommer att returnera flera rader om det finns oavgjort för förstaplatsen. row_number kommer alltid att returnera en enda rad genom att godtyckligt bryta oavgjort. Om du vill hämta andra rader än den första raden per id , då måste du tänka på slips och du kommer att få ett annat beteende från rank och dense_rank . Om två rader är lika för första, dense_rank kommer att tilldela den tredje raden en rnk av 2 medan rank kommer att tilldela den en rnk av 3.

Det här verkar fungera för de exempeldata du har lagt upp

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. datetime vs datetime2 i SQL Server:Vad är skillnaden?

  2. mysql left join sum two tabeller med rollup

  3. Hur man installerar SQL Server på Linux

  4. ändrar DEFAULT-begränsning på kolumn SQL