如何在连接上使用分区来获取计数

How to use partition on a join to get a count

我很困惑如何在 join

上不使用 group by 而获得 count

我知道我可以使用 group by 获得所需的结果,但是 table 连接很长并且有很多选择 headers with 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

我的tables:

人数

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.FirstName, p.Surname;

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