sql >> Databáze >  >> RDS >> Oracle

Získejte počty UNIKÁTNÍCH záznamů CELKOVĚ na hodnotu

Udělal jsem tabulku pro testování:

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
/

Můj první pokus by byl:Pro každého člověka (jiného) dostat jeho první pouze faxové číslo a pak proveďte normální skupinu a počítejte s tím:

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
/

Výstup bude:

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

Pak jsem si všiml, že váš požadovaný výstup obsahoval páté faxové číslo, ale s počtem nula. To lze provést například takto:

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
/

V tomto výstupu sloupec NORMALCOUNT je počet lidí, kteří mají tento fax. Sloupec COUNTUNUSED je počet lidí, kteří ještě nebyli "použiti" v předchozích počtech:

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

Trik je v tom, že otherid_on_first_fax má pouze hodnotu otherid na první faxové číslo osob, pro ostatní faxová čísla otherid_on_first_fax je NULL. count(otherid_on_first_fax) pak spočítá všechny nenulové hodnoty, z nichž pro fax 4387267572 nejsou žádné.



  1. echo něco z databáze MySQL

  2. PostgreSQL:zjistěte počet po sobě jdoucích dnů až do současnosti

  3. Proč stejný přesný dotaz vytváří 2 různé výsledky vysvětlení MySQL?

  4. Problém s kódováním MySQL – různé výsledky z Windows na linux