Oracle
 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 . Ако два реда са равни за първи, dense_rank ще присвои на третия ред rnk от 2 докато rank ще му присвои 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешка в Oracle.Dataaccess ORA-06502:PL/SQL:числова или стойностна грешка:буферът на символен низ е твърде малък

  2. Точна разлика между Oracle Client и Oracle Database

  3. DBMS_SCHEDULER.DROP_JOB само ако съществува

  4. UNPIVOT върху неопределен брой колони

  5. Вмъкване в Oracle и извличане на генерирания ID на последователност