【问题标题】:How to use partition on a join to get a count如何在连接上使用分区来获得计数
【发布时间】:2020-09-10 11:23:30
【问题描述】:

我很困惑如何在不使用group byjoin 上获得count

我知道我可以使用 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

亲人

Id | PersonId | RelativePersonId
 1      1              2
 2      1              3

我想去哪里

PersonId | FirstName | Surname | RelativesOnRecord
    1         Jim         Bo          2

我也尝试加入SELECT TOP 1,但这只是给了我一个结果,所以一个计数。如果没有group by,这甚至可能吗?

【问题讨论】:

    标签: sql sql-server database-partitioning


    【解决方案1】:

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

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

    【讨论】:

    • 啊,是的!这给了我正确的计数,但也给我留下了两个相同的行 - 我想我可以使用 DISTINCT 来过滤它们 - 我觉得我可能违反了一些 SQL 法律,但它现在对我有用!
    • 注意具有不同 ID 的同名人员,这些人员可能有相同数量的亲属记录(取决于您的用例,这可能无关紧要)。
    • 谢谢,好点子,实际上一个人还有很多标识符,但我想实际上我会只包括他们的 ID 以确保安全!当它允许我时,我会接受这个答案。如此简单,我不敢相信我什至没有尝试过。
    【解决方案2】:

    根据您的示例,您想要聚合:

    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 或相关子查询,但这里似乎不适合使用窗口函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-09
      • 2017-05-18
      • 2021-12-28
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      相关资源
      最近更新 更多