我想计算每条记录的平均等级,然后得到平均等级最高的两条记录,每个类别。
我的等级
表如下所示:
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个记录。
要得到我想要达到的结果,最好的查询是什么?
如果我没有理解错的话,您可以使用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 让您使用聚合函数,如,,, ,等而只是删除重复。