sql - SEDE 查询在所有标签中查找排名靠前的用户
问题描述
我目前在 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
我怎样才能使它只返回每个标签的顶级用户?
解决方案
我会将您的查询包装在 CTE(通用表表达式)中,然后在第二个 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
我没有包括任何排序,因为我不确定你想要这些行。请考虑此查询将显示同一标签的多行,如果有多个用户以相同的分数排在第一位。
推荐阅读
- c# - 通过 nvidia quadro 600 gpu 模式访问时 C# DOT NET 应用程序崩溃 - nvd3dum.dll 崩溃
- php - 如何从PHP中的文本中提取名称
- c++ - 如何让我的编译器更愚蠢(错误的索引)?
- html - sed 命令处理输入流并用标签替换所有HTML标签
- angular - selectionChange 不会为 mat-select 中的默认选项发出 - Angular Material
- aframe - 依赖于具有多个 true 的组件的 Aframe 组件
- python - 为什么 Python 生成的 ELF 比原始源代码大?
- swift - 如何在 macOS 上的照片应用中访问照片
- javascript - 为什么绝对定位指示符会超出相对定位容器?
- mongodb - 聚合上的未闭合括号