2017-08-11 1 views
0

Le script SQLSélectionnez Nombre maximum de groupe d'événements

select eventid_nbr, trunc(received_date, 'DD'), sentindicator, count(eventid_nbr) as count 
from eventlog 
where received_date between to_date('2017-07-01, 10:00 A.M.','YYYY-MM-DD, HH:MI A.M.') and to_date('2017-07-01, 11:00 A.M.','YYYY-MM-DD, HH:MI A.M.') 
group by eventid_nbr, trunc(received_date, 'DD'), sentindicator 
order by count desc, trunc(received_date, 'DD'); 

a sortie

EVENT RECEIVED_DATE SENTINDICATOR COUNT 

1  01-JUL-17  Y    128 
1  01-JUL-17  E1    2 
104 01-JUL-17  Y    55 
105 01-JUL-17  Y    4 
106 01-JUL-17  Y    3 

où j'ai besoin le nombre maximum choisi parmi chaque événement dans lequel la sortie apparaîtrait comme

EVENT RECEIVED_DATE SENTINDICATOR COUNT 

1  01-JUL-17  Y   128 
104 01-JUL-17  Y   55 
105 01-JUL-17  Y   4 
106 01-JUL-17  Y   3 

Pour chaque regroupement, aurais-je besoin de sélectionner max (nombre)? Comment pourrais-je y parvenir?

+0

J'ai mis à jour la question indiquant I besoin de sélectionner tous les événements (éventuellement 200) contenant des doublons comme ci-dessus avec l'événement 1, et d'inclure seulement ce tuple dont la colonne COUNT est un MAX (COUNT). Pour les événements non dupliqués, tels que 104, 105 et 106, leurs tuples sont inclus dans l'ensemble de résultats où leurs comptes sont déjà un MAX (COUNT) – Mushy

Répondre

0

Dans 12c Oracle, vous pouvez faire:

select eventid_nbr, trunc(received_date, 'DD'), sentindicator, 
     count(eventid_nbr) as count 
from eventlog 
where received_date between to_date('2017-07-01, 10:00 A.M.','YYYY-MM-DD, HH:MI A.M.') and 
          to_date('2017-07-01, 11:00 A.M.','YYYY-MM-DD, HH:MI A.M.') 
group by eventid_nbr, trunc(received_date, 'DD'), sentindicator 
order by count desc, trunc(received_date, 'DD') 
fetch first 1 row only; 

Dans les versions précédentes, une sous-requête fait la même chose:

select el.* 
from (select eventid_nbr, trunc(received_date, 'DD'), sentindicator, 
      count(eventid_nbr) as count 
     from eventlog 
     where received_date between to_date('2017-07-01, 10:00 A.M.','YYYY-MM-DD, HH:MI A.M.') and 
            to_date('2017-07-01, 11:00 A.M.','YYYY-MM-DD, HH:MI A.M.') 
     group by eventid_nbr, trunc(received_date, 'DD'), sentindicator 
     order by count desc, trunc(received_date, 'DD') 
    ) el 
where rownum = 1; 
+0

Pouvez-vous élaborer plus en fonction d'un edit à la question pour apporter plus de clarification ? – Mushy

0
select eventid,dt,sentindicator,max(count) 
from 
(
    select eventid_nbr, trunc(received_date, 'DD') as dt, sentindicator, 
    count(eventid_nbr) as count 
    from eventlog 
    where received_date between to_date('2017-07-01, 10:00 A.M.','YYYY-MM-DD, 
    HH:MI A.M.') 
    and to_date('2017-07-01, 11:00 A.M.','YYYY-MM-DD, HH:MI A.M.' 
) 
    group by eventid_nbr, trunc(received_date, 'DD'), sentindicator 
    order by count desc, trunc(received_date, 'DD'))a 
group by eventid,dt,sentindicator 
+0

il suffit d'ajouter une requête externe avec un max (count) comme une requête externe à votre requête – Aparna

0
select eventid_nbr, received_day, max(sentindicator) keep(dense_rank last order by count), max(count) as count 
from (select eventid_nbr, trunc(received_date, 'DD') as received_day, sentindicator, count(*) as count 
     from eventlog 
     where received_date between to_date('2017-07-01, 10:00 A.M.','YYYY-MM-DD, HH:MI A.M.') and to_date('2017-07-01, 11:00 A.M.','YYYY-MM-DD, HH:MI A.M.') 
     group by eventid_nbr, trunc(received_date, 'DD'), sentindicator) 
group by eventid_nbr, received_day 
order by 4 desc, received_day;