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

Oracle ListaGG, 3 najczęściej występujące wartości, podane w jednej kolumnie, pogrupowane według ID

Oto przykładowe dane

create table VET as
select 
rownum+1 Visit_Id, 
mod(rownum+1,5) Animal_id, 
cast(NULL as number)  Veterinarian_id, 
trunc(10*dbms_random.value)+1 Sickness_code
from dual
connect by level <=100;

Zapytanie

w zasadzie podzapytania wykonują następujące czynności:

sumaryczna liczba i obliczanie liczby grypy (we wszystkich rejestrach zwierzęcia)

oblicz RANK (jeśli naprawdę potrzebujesz tylko 3 rekordów, użyj ROW_NUMBER - zobacz dyskusję poniżej)

Filtruj najlepsze 3 RANKI

LISTAGreguj wynik

with agg as (
select Animal_id, Sickness_code, count(*) cnt,
sum(case when SICKNESS_CODE = 5 then 1 else 0 end) over (partition by animal_id) as cnt_flu
from vet
group by Animal_id, Sickness_code
), agg2 as (
select ANIMAL_ID, SICKNESS_CODE, CNT, cnt_flu,
rank() OVER (PARTITION BY ANIMAL_ID ORDER BY cnt DESC) rnk
from agg
), agg3 as (
select ANIMAL_ID, SICKNESS_CODE, CNT, CNT_FLU, RNK
from agg2
where rnk <= 3
)
select 
ANIMAL_ID, max(CNT_FLU) CNT_FLU,
LISTAGG(SICKNESS_CODE||'('||CNT||')', ', ') WITHIN GROUP (ORDER BY rnk)  as   cnt_lts
from agg3
group by ANIMAL_ID 
order by 1;

daje

 ANIMAL_ID    CNT_FLU CNT_LTS                                     
---------- ---------- ---------------------------------------------
         0          1 6(5), 1(4), 9(3)                              
         1          1 1(5), 3(4), 2(3), 8(3)                        
         2          0 1(5), 10(3), 4(3), 6(3), 7(3)                 
         3          1 5(4), 2(3), 4(3), 7(3)                        
         4          1 2(5), 10(4), 1(2), 3(2), 5(2), 7(2), 8(2) 

Celowo pokazuję Sickness_code (liczba wizyt), aby zademonstrować, że top 3 może mieć remisy, z którymi powinieneś sobie poradzić. Sprawdź funkcję RANK. Używasz ROW_NUMBER nie jest w tym przypadku deterministyczny.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. tworzenie ramki danych pandas z zapytania do bazy danych, które używa zmiennych bind

  2. hsqldb Wybór trybu Oracle do aktualizacji NOWIT

  3. PDB Odłącz błąd ORA-17528

  4. podzapytanie skalarne w instrukcji if Warunek w PL/SQL

  5. Wyświetlanie wartości LITAGG w komórce na podstawie wartości innej kolumny