T-SQL - 帮助进行多对多的 MAX 操作

标签 t-sql group-by many-to-many aggregate-functions max

这与我之前提出的问题密切相关。

我在帖子位置之间存在多对多关系。

连接表称为PostLocations,除了FK 之外什么也没有。 (位置 ID、帖子 ID)

我正在尝试撤回每个位置的置顶帖子

这是我的查询(在我上一个问题的答案中给出):

SELECT pl.LocationId, p.postid, p.UniqueUri, p.Content, MAX(s.BaseScore) as topscore
from dbo.PostLocations pl
inner join dbo.posts p on pl.PostId = p.PostId
inner join dbo.reviews r on p.postid = r.postid
inner join dbo.scores s on r.scoreid = s.scoreid
group by pl.locationid, p.postid, p.UniqueUri, p.Content

但问题是,因为 PostLocations 可能有这样的条目:

LocationId   PostId
1            213213
2            498324
1            230943

所以我上面的查询返回 LocationId 1 两次,因为它在连接表中有两条记录。我只需要每个位置 1 条记录 - 每个位置 ID 的顶部帖子。

我也尝试过这个:

SELECT l.LocationId, p.postid, p.UniqueUri, p.Content, MAX(s.BaseScore) as topscore
from dbo.PostLocations pl
inner join dbo.Locations l on pl.LocationId = l.LocationId
inner join dbo.posts p on pl.PostId = p.PostId
inner join dbo.reviews r on p.postid = r.postid
inner join dbo.scores s on r.scoreid = s.scoreid
group by l.locationid, p.postid, p.UniqueUri, p.Content

相同的结果 - 这是返回的结果:

LocationId   PostId   UniqueUri   Content   TopScore
1            213213   some-post   pew pew   2.00
2            498324   anot-post   blah bl   4.50
1            230943   sadjsa-as   asijd a   3.5

这是应该返回的内容:

LocationId   PostId   UniqueUri   Content   TopScore
1            230943   sadjsa-as   asijd a   3.5
2            498324   anot-post   blah bl   4.50

因为 LocationId 1 有 2 个帖子,但 PostId 230943 得分最高,所以这是返回的帖子。

对我缺少的东西有什么想法吗?

最佳答案

如果您使用的是 SQL Server 2005 或更高版本,您可以执行以下操作:

With RankedLocations As
    (
    Select PL.LocationId
        , S.BaseScore
        , P.PostID
        , P.UniqueUri
        , P.Content
        , Row_Number() Over( Partition By PL.LocationId Order By S.BaseScore Desc ) As ScoreRank
    From dbo.PostLocations As PL
        Join dbo.Posts As P
            On P.PostId = PL.PostId
        Join dbo.Reviews As R
            On R.PostId = P.PostId
        Join dbo.Scores As S
            On S.ScoreId = R.ScoreId
    )
Select LocationId, BaseScore, PostID, UniqueUri, Content
From RankedLocations
Where ScoreRank = 1

关于T-SQL - 帮助进行多对多的 MAX 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4495104/

相关文章:

mysql - MAX() 函数未按预期工作

mapping - Entity Framework 代码优先 - 多对多外键问题

mysql - Doctrine2 与 Symfony2 : Why does cascade persist not work on this many-to-many relationship?

c# - 如何在 Entity Framework 中添加或删除多对多关系?

sql - T-SQL,制作列表

linq-to-sql - Linq to SQL-按订购的总数量分组产品

SQL 查询选择具有不同主题的最新记录

t-sql - SQL 事务中 # 的含义

sql - 检查sql作业是否正在运行

sql - 根据其他记录更新记录