यहां नमूना डेटा
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
का उपयोग करना इस मामले में नियतात्मक नहीं है।