当前位置: 首页 > 知识库问答 >
问题:

获取具有最高平均等级的两个记录的对

姬凡
2023-03-14

我想计算每条记录的平均等级,然后得到平均等级最高的两条记录,每个类别。

我的等级表如下所示:

userid | recordid | grade
123    | 1        | 8
123    | 2        | 1
123    | 3        | 3
123    | 4        | 6
121    | 1        | 3
121    | 2        | 7
121    | 3        | 1
121    | 4        | 8
124    | 1        | 6
124    | 2        | 8
124    | 3        | 9
124    | 4        | 5

记录表,如下所示:

id | userid | name | category | year
1  | 101    | Foo  | FooCat   | 2021
2  | 102    | Bar  | FooCat   | 2021
3  | 103    | Foos | BarCat   | 2021
4  | 104    | Bars | BarCat   | 2021

结果将如下所示:

id | name | category | grade_avg
4  | Bars | BarCat   | 6.3
1  | Foo  | FooCat   | 5.7
2  | Bar  | FooCat   | 5.3
3  | Foos | BarCat   | 4.3

我当前正在使用此SQL查询:

SELECT S.id, S.name, S.category, AVG(IB.grade) AS grade_avg
FROM (SELECT id, name, category, year, row_number() over (partition by category) as r FROM records) S
INNER JOIN grades IB ON IB.recordid = S.id
WHERE S.r < 3 AND S.year=2021
GROUP BY IB.recordid
ORDER BY grade_avg DESC

分组确实工作得很好,但是分区时的等级不是按平均等级排序的,所以您只得到每个类别的前2个记录。

要得到我想要达到的结果,最好的查询是什么?

共有1个答案

易品
2023-03-14

如果我没有理解错的话,您可以使用row_number()枚举行,得到等级最高的两行,然后聚合:

select name, category, avg(grade)
from (select g.*, r.name, r.category,
             row_number() over (partition by g.recordid order by g.grade desc) as seqnum
      from grades g join
           records r
           on g.recordid = r.id
      where r.year = 2021
     ) g
where seqnum <= 2
group by name, category;

这是一个dB<>小提琴。

编辑:

根据您的结果,您需要的只是整体平均值,而不是前两行的平均值。这就简单多了:

select r.name, r.category, avg(grade)
from grades g join
     records r
     on g.recordid = r.id
where r.year = 2021
group by r.name, r.category
 类似资料:
  • 问题内容: 我有一个java.util.Date对象数组。我试图找到平均值。 例如,如果我有2个日期对象,分别是7:40 AM和7:50 AM。我应该获得7:45 AM的平均日期对象。 我正在考虑的方法效率低下: 用于遍历所有日期 找出0000与时间之间的时差 将时间差加到总计 除以总数 将该时间转换为日期对象 有更简单的功能可以做到这一点吗? 问题答案: 好的,从根本上讲,您可以将所有对象的“自

  • 问题内容: 怎么做? 该问题的原标题是“ 在带有子查询的复杂查询中使用等级(@Rank:= @Rank + 1)-可以吗? ”,因为我一直在寻找使用等级的解决方案,但是现在我看到Bill所发布的解决方案是好多了。 原始问题: 我正在尝试组成一个查询,该查询将从给定定义顺序的每个组中获取最后一条记录: 表达式通常用于等级,但对我来说,在2个子查询中使用时,它看起来可疑,但仅初始化一次。这样行吗? 其

  • 问题内容: 不幸的是,SQL并不是很容易找到我。我有两个表,一个表和一个表。 贷款支付表: ID(主键),LoanID(与贷款表上的ID匹配),PaymentDate,Amount等。 我需要一条sql语句,该语句可以给我每个月输入的最后一笔付款(如果有的话)。我目前的说法没有给我结果。还存在一个问题,有时在该月的最大日期有时会有平局,因此我也必须能够处理该问题(我的想法是在平局的情况下选择最大的

  • 我试图通过DP找到所有子数组的加权平均值,然后按列排序,找到长度相同的2。但我无法继续下去,我的方法似乎太模糊/太粗暴了。我将非常感谢任何帮助。提前谢了。

  • 问题内容: 我想获得最高值,但按同一表ex上的另一个字段分组: seqid + fileid +名称 结果必须是 seqid + fileid +名称 注意:所有字段都必须像使用select一样显示*我将不胜感激。tnx 问题答案: 怎么样

  • 问题内容: 我有一张桌子和and collums。 我想得到每个的总数。我正在尝试以下查询: 我也试过这个查询 但是没有得到实际的结果。我想要以上数据的结果: 问题答案: 您只需要使用而不是即可。因此,请尝试以下查询: 看到这个SQLFiddle 让您使用聚合函数,如,,, ,等而只是删除重复。