SEDE-запрос для поиска топ-пользователя по всем тегам - PullRequest
0 голосов
/ 17 октября 2018

В настоящее время я создал следующий запрос в SEDE, чтобы найти лучшего пользователя в каждом теге по общему количеству ответов и баллов.Его можно найти здесь: Лучший пользователь во всех тегах по количеству баллов и количеству ответов .Тем не менее, в данный момент он возвращает несколько топ-пользователей по тегу, что понятно, потому что я еще не ограничивал это.

Вот запрос:

SELECT TOP 50
       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, 
     Posts q
     INNER JOIN PostTags qt ON q.Id = qt.PostId
     INNER JOIN Tags t ON t.Id = qt.TagId
WHERE a.ParentId = q.Id
      AND a.PostTypeId = 2
      AND a.CommunityOwnedDate IS NULL
      AND a.OwnerUserId IS NOT NULL
GROUP BY a.OwnerUserId, t.TagName
ORDER BY ((SUM(a.Score) / 10) + COUNT(a.Score)) / 2 DESC

Как сделать так, чтобы он возвращал только верхнего пользователя по тегу?

1 Ответ

0 голосов
/ 17 октября 2018

Я бы обернул ваш запрос в 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

Я не включил ни одного порядка, так как я не уверен, как вы хотите строки.Учтите, что этот запрос покажет несколько строк для одного и того же тега, если несколько пользователей, во-первых, связаны с одинаковым счетом.

...