sql >> Database teknologi >  >> RDS >> Oracle

Oracle ListaGG, Top 3 mest hyppige værdier, angivet i én kolonne, grupperet efter ID

Her er eksempeldata

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;
 

Forespørgsel

dybest set gør underforespørgslerne følgende:

aggregeret tal og beregne influenzatal (i alle dyreregistre)

beregn RANK (hvis du virkelig kun har brug for 3 poster, brug ROW_NUMBER - se diskussion nedenfor)

Filter top 3 RANK

LISTAGGregat resultat

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;
 

giver

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)

Jeg viser med vilje Sygdomskode (tæl besøg) for at demonstrere, at top 3 kan have bånd, som du bør håndtere. Tjek RANK-funktionen. Bruger ROW_NUMBER er ikke deterministisk i dette tilfælde.



  1. Skal dette ER-diagram bruge et ternært forhold i stedet for

  2. Fejl ved oprettelse af en geografisk database. FEJL:kunne ikke indlæse biblioteket /usr/pgsql-9.1/lib/rtpostgis-2.0.so

  3. Kompliceret MySQL-forespørgsel

  4. Hent navne fra kommaseparerede id'er i SQL