Oracle
 sql >> база данни >  >> RDS >> Oracle

Получете брой УНИКАЛНИ записи ОБЩО за стойност

Направих таблицата за тестване:

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
/

Първият ми шанс би бил:За всеки човек (otherid) вземете неговия първи само номер на факс и след това направете нормално групиране по и разчитайте на това:

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
/

Резултатът ще бъде:

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

След това забелязах, че желаният ви изход включва петия номер на факс, но с нула. Това може да стане например по следния начин:

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
/

В този изход колона NORMALCOUNT е броят на хората, които имат този факс. Колона COUNTUNUSED е броят на хората, които още не са „използвани“ в предишните преброявания:

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

Номерът е, че otherid_on_first_fax има само стойността на otherid на първия факс номер на лицата, за останалите факс номера на лицата otherid_on_first_fax е NULL. count(otherid_on_first_fax) след това преброява всички ненулеви стойности, от които няма нито една за факс 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. Как избирате поле varchar2 във формат „HH24:MI:SSxFF6“ като ИНТЕРВАЛ ЧАС ДО СЕКУНДА(6)?

  2. c# Entity Framework EF 4.1 Промяна на името на схемата и базата данни по време на изпълнение

  3. дублиращите се записи трябва да изтрият oracle db

  4. работа с json в oracle

  5. JDBC връща празен набор от резултати