Выберите округа, содержащие указанный c набор фамилий - PullRequest
0 голосов
/ 29 февраля 2020

Если у меня есть очень большая таблица имен с тремя столбцами - именем, фамилией и округом, как указано ниже:

name surname county
John Williams Broward
Steve Milne Broward
Mary Granville Mahony
Josephine Jackson Kent
Jane Wright Kent
...

, что будет лучшим подходом для поиска округов, которые содержат все следующие фамилии Гриффи, Гриффи и Гриффин. Я хотел бы, чтобы результат содержал счет наименее распространенного имени в этом округе. Так что, если графство Кент содержит 5 грифонов, 4 грифонов и 1 гриффи, я хотел бы видеть следующее как часть результата:

Kent 1 

Это насколько я получил:

select county, surname, count(*) from census_data where surname = "Griffin" or surname = "Griffy" or surname == "Griffey" group by county, surname;

Я не уверен, что это правильный подход к поиску ответа.

1 Ответ

1 голос
/ 29 февраля 2020

Сначала создайте CTE, который возвращает все округа, содержащие все фамилии, которые вы ищете, а затем используйте RANK() оконную функцию:

with cte as (
  select county,
    sum(surname = 'Griffin') counter1, 
    sum(surname = 'Griffy') counter2,
    sum(surname = 'Griffey') counter3
  from census_data 
  where surname in ('Griffin', 'Griffy', 'Griffey')
  group by county 
  having counter1 * counter2 * counter3 > 0
)
select county, min(counter1, counter2, counter3) least_common_name_counter
from (
  select *, rank() over (order by min(counter1, counter2, counter3)) rank
  from cte
)
where rank = 1 

или если вы хотите получить результаты для всех округов:

with cte as (
  select county,
    sum(surname = 'Griffin') counter1, 
    sum(surname = 'Griffy') counter2,
    sum(surname = 'Griffey') counter3
  from census_data 
  where surname in ('Griffin', 'Griffy', 'Griffey')
  group by county 
  having counter1 * counter2 * counter3 > 0
)
select county, min(counter1, counter2, counter3) least_common_name_counter
from cte
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...