Oracle
 sql >> Base de données >  >> RDS >> Oracle

Obtenir le nombre d'enregistrements UNIQUE GLOBAL par valeur

J'ai fait le tableau pour tester :

create table nr_pvo_120 (
   otherid,
   fax
)
as
select 12365092    , 2762364204 from dual union all
select 12005656    , 2762364204 from dual union all
select 12484936    , 2762364204 from dual union all
select 39003042    , 2762364204 from dual union all
select 12365597    , 2762364204 from dual union all
select 12635922    , 2762364204 from dual union all
select 12332346    , 2762364204 from dual union all
select 12365092    , 4387267572 from dual union all
select 12005656    , 4387267572 from dual union all
select 12365092    , 4422911281 from dual union all
select 12005656    , 4422911281 from dual union all
select 12484936    , 4422911281 from dual union all
select 12651239    , 4422911281 from dual union all
select 12388710    , 4422911281 from dual union all
select 12686953    , 4422911281 from dual union all
select 12365092    , 4423311213 from dual union all
select 12005656    , 4423311213 from dual union all
select 12709544    , 4423311213 from dual union all
select 12484936    , 4423311213 from dual union all
select 12005656    , 4424450542 from dual union all
select 12346839    , 4424450542 from dual union all
select 12365120    , 4424450542 from dual union all
select 12484936    , 4424450542 from dual union all
select 12086512    , 4424450542 from dual
/

Mon premier coup serait :Pour chaque personne (otherid) obtenez son premier numéro de fax uniquement, puis effectuez un regroupement normal et comptez dessus :

select first_fax, count(*) firstcount
  from (
   select otherid, min(fax) first_fax
     from nr_pvo_120
    group by otherid
       )
 group by first_fax
 order by first_fax
/

La sortie deviendra :

 FIRST_FAX FIRSTCOUNT
---------- ----------
2762364204          7
4422911281          3
4423311213          1
4424450542          3

Ensuite, j'ai remarqué que la sortie souhaitée incluait le cinquième numéro de fax, mais avec un compte de zéro. Cela peut par exemple être fait comme ceci :

select fax, count(*) normalcount, count(otherid_on_first_fax) countunused
  from (
   select fax, otherid,
          case
             when fax = min(fax) over (partition by otherid order by fax)
             then otherid
          end otherid_on_first_fax
     from nr_pvo_120
       )
 group by fax
 order by fax
/

Dans cette sortie, la colonne NORMALCOUNT est le nombre de personnes ayant ce fax. Colonne COUNTUNUSED est le nombre de personnes qui n'ont pas encore été "utilisées" dans les décomptes précédents :

       FAX NORMALCOUNT COUNTUNUSED
---------- ----------- -----------
2762364204           7           7
4387267572           2           0
4422911281           6           3
4423311213           4           1
4424450542           5           3

L'astuce est que otherid_on_first_fax n'a que la valeur de otherid sur le premier numéro de fax de la personne, pour le reste des numéros de fax de la personne otherid_on_first_fax est NUL. count(otherid_on_first_fax) compte ensuite toutes les valeurs non nulles, dont il n'y en a pas pour le fax 4387267572.