-1

我正在尝试创建一个查询,该查询将显示每个用户的帖子 ID、PostTypeId 以及该帖子类型的最高分数。

例如,对于所有属于问题的帖子 (PostTypeId = 1),那么 (PostTypeId = 1) 的所有行的最高分列将为“22363”。

到目前为止,我只得到每个帖子的分数表并按 DESC 排序以获得最高分数。我看到一个问题的最高分是 22363,我想为所有问题显示这个数字。

SELECT 
    TOP 100
    Users.Id,
    DisplayName,
    PostTypeId, 
    MAX(CAST(Score AS float)) AS MaxAnswerScore
FROM
    Posts
  INNER JOIN
    Users ON Users.Id = OwnerUserId
GROUP BY
    Users.Id, DisplayName, PostTypeId
ORDER BY
    MaxAnswerScore DESC

我正在尝试对所有 PostTypeId 执行此操作,而不仅仅是问题。

当前实施

4

1 回答 1

2

您可以使用row_number()按用户划分的最大分数降序为每一行分配一个数字。然后只取第一条记录。

SELECT x.id,
       x.displayname,
       x.posttypeid,
       x.score
       FROM (SELECT u.id,
                    u.displayname,
                    p.posttypeid,
                    max(cast(score AS float)) score,
                    row_number() OVER (PARTITION BY u.id
                                       ORDER BY max(cast(score AS float)) DESC) rn
                    FROM users u
                         INNER JOIN posts p
                                    ON p.owneruserid = u.id
                    GROUP BY u.id,
                             u.displayname,
                             p.posttypeid) x
       WHERE x.rn = 1
       ORDER BY x.score DESC;

如果您想查看平局,即如果用户在多个帖子类型中获得最高分,请替换row_number()rank()


编辑:

仍然不确定你想要什么,但让我们再试一次:

SELECT u1.id,
       u1.displayname,
       p1.posttypeid,
       max(cast(p1.score AS float)) score,
       (SELECT max(cast(p2.score AS float))
               FROM posts p2
               WHERE p2.posttypeid = p1.posttypeid) maximumscore
       FROM users u1
            INNER JOIN posts p1
                       ON p1.owneruserid = u1.id
       GROUP BY u1.id,
                u1.displayname,
                p1.posttypeid
       ORDER BY p1.posttypeid,
                max(cast(p1.score AS float)) DESC;
于 2018-12-29T20:04:03.037 回答