如何在联接上使用分区来计数

问题描述

我很困惑如何在count上不使用group by的情况下获得join

我知道我可以使用group by获得所需的结果,但是表联接很长,并且带有case语句的选定标题很多,所以我希望避免这种情况

我敢肯定,在使用partition over之前已经完成了此操作,但是找不到在联接上使用它的好例子。也许不可能!?

我尝试过

select
    p.FirstName,p.Surname,count(pr.RelativePersonId) over (partition by pr.RelativePersonId) as [RelativesOnRecord]
from People p
left join PersonRelatives pr
    on p.PersonId = pr.PersonId

对于我的桌子:

PersonId | FirstName | Surname
   1          Jim       Bo
   2         Harry      Bo
   3         Strong     Bo

PersonRelatives

Id | PersonId | RelativePersonId
 1      1              2
 2      1              3

我要去哪里

PersonId | FirstName | Surname | RelativesOnRecord
    1         Jim         Bo          2

我也尝试过加入SELECT TOP 1,但这只给了我一个结果,因此很重要。如果没有group by,这是否有可能?

解决方法

似乎您按错误的列进行了分区-您想获取People中每个人的亲属数量,对吗?使用

count(pr.RelativePersonId) over (partition by pr.PersonId) as [RelativesOnRecord]
,

根据您的示例,您想要进行汇总:

select p.PersonId,p.FirstName,p.Surname,count(*) as [RelativesOnRecord]
from People p join
     PersonRelatives pr
     on p.PersonId = pr.PersonId
group by p.PersonId,p.Surname;

您可以使用apply或相关子查询,但是窗口函数在这里似乎不合适。