Sqlite 选择包含一组特定姓氏的县

Sqlite 选择包含一组特定姓氏的县,sqlite,Sqlite,如果我有一个非常大的姓名表,有三列——姓名、姓氏和县,如下所示: name surname county John Williams Broward Steve Milne Broward Mary Granville Mahony Josephine Jackson Kent Jane Wright Kent ... 找到包含以下所有姓氏的县的最佳方法是什么:格里菲、格里菲和格里芬。我希望结果包含该县最不常见姓名的计数。因此,如果肯特县包含5只格里芬,4只格里菲和1只格里菲,我希望看到以下结

如果我有一个非常大的姓名表,有三列——姓名、姓氏和县,如下所示:

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;

我不确定这是否是找到答案的正确方法

首先创建一个
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