Я бы обернул ваш запрос в CTE (Common Table Expression), затем вычислил максимальный балл за тег для второго CTE и, наконец, просто соединил оба CTE, чтобы получить лучших пользователей по тегу.Запрос должен выглядеть следующим образом:
with user_tag as ( -- score per user, per tag
SELECT t.TagName,
a.OwnerUserId AS [User Link],
SUM(a.Score) / 10 AS Score,
COUNT(a.Score) AS [Count],
((SUM(a.Score) / 10) + COUNT(a.Score)) / 2 AS Total
FROM Posts a
JOIN Posts q on a.ParentId = q.Id
JOIN PostTags qt ON q.Id = qt.PostId
JOIN Tags t ON t.Id = qt.TagId
WHERE a.PostTypeId = 2
AND a.CommunityOwnedDate IS NULL
AND a.OwnerUserId IS NOT NULL
GROUP BY a.OwnerUserId, t.TagName
),
max_score as ( -- max score per tag
select TagName, max(Total) as max_score
from user_tag
group by TagName
)
select
u.*
from user_tag u
join max_score m on m.TagName = u.TagName
and m.max_score = u.Total
Я не включил ни одного порядка, так как я не уверен, как вы хотите строки.Учтите, что этот запрос покажет несколько строк для одного и того же тега, если несколько пользователей, во-первых, связаны с одинаковым счетом.