Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Zapytanie SQL Wybierz pierwszą pozycję 1 wiersz z wielu rang/grupy

W funkcji analitycznej możesz określić wiele warunków do zamówienia

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

Zakładam, że chcesz dense_rank biorąc pod uwagę, że użyłeś dense_rank etykietka. Nie mówisz o tym, jak chcesz radzić sobie z remisami ani czy remisy są w ogóle możliwe, więc z samego pytania nie wynika jasno, czy chcesz używać rank , dense_rank lub row_number funkcje analityczne. Jeśli pobierasz tylko wiersz o najwyższym rankingu według id , rank i dense_rank zachowa się identycznie i zwróci wiele wierszy, jeśli są remisy na pierwszym miejscu. row_number zawsze zwróci pojedynczy wiersz, arbitralnie przerywając remis. Jeśli chcesz pobrać wiersze inne niż pierwszy wiersz według id , musisz pomyśleć o remisach, a uzyskasz inne zachowanie od rank i dense_rank . Jeśli dwa wiersze są równe jako pierwsze, dense_rank przypisze trzeciemu wierszowi rnk z 2 podczas rank przypisze mu rnk z 3.

Wygląda na to, że działa to w przypadku przesłanych przez Ciebie przykładowych danych

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. Kopiowanie wiersza w tej samej tabeli bez konieczności wpisywania ponad 50 nazw kolumn (przy zmianie 2 kolumn)

  2. oci_bind_by_name i do_date PHP/OCI/Oracle

  3. Przesyłaj obrazy jako obiekty BLOB w Oracle za pomocą PHP

  4. Jak tworzyć procedury składowane PL/SQL z parametrami w bazie danych Oracle

  5. Jak korzystać z tabel Oracle PLSQL (tablica asocjacyjna lub tabela indeksowana)