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