Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle ListaGG, शीर्ष 3 सबसे लगातार मान, एक कॉलम में दिए गए, आईडी द्वारा समूहीकृत

यहां नमूना डेटा

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;

प्रश्न

मूल रूप से उपश्रेणियाँ निम्न कार्य करती हैं:

कुल गिनती और फ्लू गिनती की गणना (जानवर के सभी रिकॉर्ड में)

रैंक की गणना करें (यदि आपको वास्तव में केवल 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) 

मैं जानबूझकर सिकनेस_कोड (विजिट की गिनती) दिखाता हूं ताकि यह दिखाया जा सके कि शीर्ष 3 में ऐसे संबंध हो सकते हैं जिन्हें आपको संभालना चाहिए। रैंक फ़ंक्शन की जांच करें। 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. ऑफ़सेट परिवर्तनीय होने पर मैं अगली घटना कैसे प्राप्त करूं?

  2. Oracle regexp_replace द्वारा अंतरिक्ष से अलग की गई सूची से डुप्लिकेट कैसे निकालें?

  3. कृपया SQLPLUS के साथ मदद करें? प्रारंभ में DEFINE `OFF` के साथ SQLPLUS स्टार्टअप कैसे बनाएं?

  4. मैं पैरामीटर मानों के साथ Oracle संग्रहीत कार्यविधि कॉल को कैसे लॉग/ट्रेस करूं?

  5. Oracle क्वेरी त्रुटि दे रही है