Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle ListaGG, Топ 3 най-често срещани стойности, дадени в една колона, групирани по ID

Ето примерни данни

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;

Заявка

основно подзаявките правят следното:

обобщено преброяване и изчисляване на броя на грипа (във всички записи на животното)

изчислете RANK (ако наистина имате нужда само от 3 записа, използвайте ROW_NUMBER - вижте дискусията по-долу)

Филтрирайте първите 3 РАНКА

LISTAG Обобщен резултат

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;

дава

 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) 

Умишлено показвам Sickness_code (брой посещения), за да покажа, че топ 3 може да имат връзки, които трябва да управлявате. Проверете функцията RANK. Използване на ROW_NUMBER не е детерминистично в този случай.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Създайте XML с XMLELEMENT - ORACLE SQL 11g заявка

  2. Запитване за вложена таблица

  3. Въведение в PL/SQL Ref курсори в Oracle Database

  4. Как да извика супер метод на Oracle PL/SQL обект

  5. Много дълго време за отваряне на SQL връзка