所以我有一张桌子,如下所示:
ID_STUDENT | ID_CLASS | GRADE
-----------------------------
1 | 1 | 90
1 | 2 | 80
2 | 1 | 99
3 | 1 | 80
4 | 1 | 70
5 | 2 | 78
6 | 2 | 90
6 | 3 | 50
7 | 3 | 90
然后,我需要对它们进行分组,排序和排序以给出:
ID_STUDENT | ID_CLASS | GRADE | RANK
------------------------------------
2 | 1 | 99 | 1
1 | 1 | 90 | 2
3 | 1 | 80 | 3
4 | 1 | 70 | 4
6 | 2 | 90 | 1
1 | 2 | 80 | 2
5 | 2 | 78 | 3
7 | 3 | 90 | 1
6 | 3 | 50 | 2
现在,我知道您可以使用temp变量进行排名,例如此处,但是如何对分组集进行排名呢?感谢您的见解!
SELECT id_student, id_class, grade,
@student:=CASE WHEN @class <> id_class THEN 0 ELSE @student+1 END AS rn,
@class:=id_class AS clset
FROM
(SELECT @student:= -1) s,
(SELECT @class:= -1) c,
(SELECT *
FROM mytable
ORDER BY id_class, id_student
) t
这以非常简单的方式起作用:
id_class
第一,id_student
第二顺序排序。@student
并@class
初始化为-1
@class
用于测试是否输入下一组。如果的先前值id_class
(存储在中@class
)不等于当前值(存储在中id_class
),则将@student
其清零。否则增加。@class
分配了新值id_class
,并将在下一行的第3步的测试中使用该值。本文向大家介绍如何在MySQL中按分组字段排序?,包括了如何在MySQL中按分组字段排序?的使用技巧和注意事项,需要的朋友参考一下 要对分组字段进行ORDER BY,请将ORDER BY CASE与一起使用。CASE评估不同的条件,而ORDER BY则按升序或降序对值进行排序。MySQL用于查找匹配项。 让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记
问题内容: 我如何返回在MySQL中实际上是“连续的” GROUP BY。换句话说,GROUP BY是否尊重记录集的顺序? 例如,从下表中,col1是唯一的有序索引: 返回: 但我需要返回以下内容: 问题答案: 采用: 这里的关键是创建一个允许分组的人为值。 以前,更正了Guffa的答案:
在声纳分析中,我们有很多符号执行的异常(在这里描述)。据我所知,负责符号执行的规则是S2259和S2583,所以我创建了一个质量配置文件,排除了这些规则,但在声纳分析中仍然有excetpions。我们使用sonar-maven-plugin进行分析,我用sonar6.5和sonar6.7进行了测试。我如何将符号执行排除在分析之外。
问题内容: Oracle的表服务器提供了一个内置功能。此功能将任何时间戳转换为前一个星期日的午夜。在MySQL中执行此操作的最佳方法是什么? Oracle还提供将时间戳转换为发生该月的第一天的午夜。在MySQL中,这很简单: 但是这个技巧将在数周内失效。我知道此功能,但是我真的不想要一年内的星期数。这些东西是用于多年的工作。 问题答案: 想通了…有点麻烦,但这就是。 而且,如果您的业务规则说您的工
问题内容: 如何返回在MySQL中实际上是“连续的” GROUP BY的内容。换句话说,GROUP BY是否尊重记录集的顺序? 例如,从下表中,col1是唯一的有序索引: 返回: 但我需要返回以下内容: 问题答案: 使用: 这里的关键是创建一个允许分组的人为值。 以前,更正了Guffa的答案:
问题内容: 我需要找到每个作者的最新帖子,然后对结果进行分组,所以我只为每个作者撰写一个最新帖子。 这样可以正确地对输出进行分组,因此每个作者只能得到一篇帖子,但是在对结果进行分组之后而不是在选择之前对结果进行排序。 问题答案: 编辑: 经过一番评论后,我决定添加一些其他信息。 我工作的公司也使用Postgres,尤其是SQL Server。该数据库不允许此类查询。因此,我知道还有另一种方法(我在