Нахождение максимальной оценки PostTypeId для каждого сообщения - проводник данных - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь создать запрос, который будет отображать идентификатор сообщения каждого пользователя, 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

Я пытаюсь сделать это для всех PostTypeIds, а не только для вопросов.

Текущая реализация

1 Ответ

0 голосов
/ 29 декабря 2018

Вы можете использовать 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;
...