Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Oracle ListaGG, 3 nilai teratas yang paling sering, diberikan dalam satu kolom, dikelompokkan berdasarkan ID

Berikut contoh data

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;

Kueri

pada dasarnya subquery melakukan hal berikut:

hitung agregat dan hitung jumlah flu (dalam semua catatan hewan)

hitung RANK (jika Anda benar-benar hanya membutuhkan 3 catatan gunakan ROW_NUMBER - lihat pembahasan di bawah)

Filter 3 PERINGKAT teratas

LISTAGHasil gabungan

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;

memberikan

 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) 

Saya sengaja menunjukkan Sickness_code (hitung kunjungan) untuk menunjukkan bahwa 3 teratas dapat memiliki ikatan yang harus Anda tangani. Periksa fungsi RANK. Menggunakan ROW_NUMBER tidak deterministik dalam kasus ini.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apakah inner join sama dengan equi-join?

  2. Beberapa sisipan SQL oracle

  3. KUNCI ASING PADA HAPUS BATASAN Kesalahan - Oracle

  4. Memberikan Hak Istimewa Buat Direktori di Oracle

  5. Cara Mendefinisikan Kunci Utama Peningkatan Otomatis di Oracle