我一直试图回答这个看似简单的问题,但我被困了
我有两个包含7M个人信息的表,一个包含姓名[包括姓氏]信息,另一个包含[包括州]信息。它们加在id
上我想找到每个州最常见的姓氏。所以我想按如下方式返回一个列表,按字母顺序排列,并按最常用名称的计数
:State: :Name: :Count:
State A Planck 5789
State B Heisenberg 8412
State C Dirac 2178
似乎它应该很容易,但我已经陷入困境,提前谢谢!
答案 0 :(得分:3)
我会选择row_number()
和group by
:
select state, name, cnt
from (select state, name, count(*) as cnt,
rank() over (partition by state order by count(*) desc) as seqnum
from t
group by state, name
) t
where seqnum = 1;
这使用rank()
,因此如果第一个地方有联系,它将返回多行。如果要在关系中返回任意一行,请使用row_number()
。
答案 1 :(得分:1)
您需要GROUP BY
:
select t.state, t.name, t.count
from (select State, Name, count(*) as count
row_number() over (order by count(*) desc) as seq
from table
group by State, Name
) t
where seq = 1;
答案 2 :(得分:0)
我会确保在对其进行分组之前将UPPER()
或可能INITCAP()
应用于姓氏,除非您想要大小写的变体(例如McDonald
vs. { {1}})要区分:
Mcdonald
希望这有帮助。