Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Uzyskaj liczbę UNIKALNYCH rekordów OGÓLNIE na wartość

Zrobiłem stół do testów:

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
/

Moim pierwszym strzałem byłoby:dla każdej osoby (innej) zdobądź swoją pierwszą tylko numer faksu, a następnie wykonaj normalne grupowanie i licz na to:

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
/

Dane wyjściowe będą wyglądały następująco:

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

Potem zauważyłem, że pożądany wynik zawiera piąty numer faksu, ale z liczbą zero. Można to zrobić na przykład tak:

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
/

W tych danych wyjściowych kolumna NORMALCOUNT to liczba osób posiadających ten faks. Kolumna COUNTUNUSED to liczba osób, które nie zostały jeszcze „używane” w poprzednich wyliczeniach:

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

Sztuczka polega na tym, że otherid_on_first_fax ma tylko wartość otherid na pierwszy numer faksu osoby, dla pozostałych osób numery faksu otherid_on_first_fax ma wartość NULL. count(otherid_on_first_fax) następnie zlicza wszystkie wartości inne niż null, z których nie ma żadnych dla faksu 4387267572.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 4 sposoby na zmianę strefy czasowej w Oracle

  2. Jak utworzyć tabelę zagnieżdżoną przy użyciu typu danych zdefiniowanego przez użytkownika w bazie danych Oracle

  3. błąd nadsubskrypcji drzewa literału/długości podczas tworzenia bazy danych

  4. Dodaj atrybut do xmltype z wartością pobraną z sekwencji

  5. Jak mogę uzyskać unikalne znaki z ciągu w Oracle?