SQL с использованием агрегатов с использованием комбинации min (), count (), с предложением - PullRequest
0 голосов
/ 14 ноября 2018

Попытка найти код, который позволит мне посчитать имена по группам, а затем вернуть имя с наименьшим счетом.

Пример данных: -

PersonGroup   FirstName
------------------------
A             Bob
A             Mary
A             Bob
A             Bob
B             Michelle
B             Michelle
B             Greg
B             Greg
B             Michelle
C             Cindy
C             Michelle
C             Michelle
D             Rod
D             Rod
D             Rod
D             Rod
D             Rod
D             Mary
D             Mary
D             Mary
D             Mary
D             Mary
D             Mary

Требуется вывод:

PersonGroup   FirstName    Count
--------------------------------
    A         Mary           1
    B         Greg           2
    C         Cindy          1
    D         Rod            5

Имя столбца с именем, наименее встречается в группе

Столбец Count содержит счетчик Name, который встречается наименьшее количество раз на группу

Пока это мой код, но возвращается каждое имя,

select
    PersonType,
    FirstName,
    count (firstName) as mycount
from
    [Person].[Person]
group by 
    FirstName,
    [PersonType]
having 
    count(firstName) = (select min(a.cnt)
                        from 
                             (select count(firstname) as cnt 
                              from [Person].[Person] 
                              group by [FirstName]) as a)
order by 
    PersonType desc

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

использовать оконную функцию row_number()

    with cte as
(
  select 'A' as PersonGroup, 'Bob' as name
  union all
  select 'A', 'Mary'
   union all
  select 'A', 'Mary'
    union all
  select 'B', 'Michelle'  
    union all
  select 'B', 'Greg'  
     union all
  select 'B', 'Greg' 
    union all
  select 'B', 'Michelle'
     union all
  select 'B', 'Michelle'
    union all
  select 'C', 'Michelle'
     union all
  select 'C', 'Michelle'
     union all
  select 'C', 'Cindy'
     union all
  select 'D', 'Rod'  
     union all
  select 'D', 'Rod'  
     union all
  select 'D', 'Rod'
    union all
  select 'D', 'Rod'  
     union all
  select 'D', 'Rod'
     union all
  select 'D', 'Mary'
     union all
  select 'D', 'Mary'
     union all
  select 'D', 'Mary'
     union all
  select 'D', 'Mary'
     union all
  select 'D', 'Mary'
     union all
  select 'D', 'Mary'
)
 , cte3 as (
  select personGroup, name, COUNT(*) as cnt, row_number() over(partition by PersonGroup order by COUNT(*) ) rn  from cte GROUP BY personGroup, name
      ) select PersonGroup,name,cnt from cte3 where rn=1

демонстрационная ссылка

enter image description here

0 голосов
/ 14 ноября 2018

вы можете использовать row_number ()

select a.*
from (select PersonType,FirstName ,count (firstName) as mycount, 
             row_number() over (partition by PersonType order by count(*)) as rn
      from [Person].[Person]
     group by FirstName,[PersonType]
     ) a
where rn= 1; 
...