1,找出id最大的且其余字段相同的重复数据,且在这基础上保留id最大的那条数据
-
SELECT MAX(id) AS id, col1, col2, col3 FROM table_name GROUP BY col1, col2, col3 HAVING COUNT(*) > 1
-
首先根据 col1、col2 和 col3 进行分组,然后使用
HAVING COUNT(*) > 1 找出重复数据(即分组后存在两个及以上的元素)。最后使用 MAX(id) 求出每组中 id 最大的那个元素,并别名为 id。
2,有一张 学生信息表,(姓名,学号,班级),找出所有姓名相同人的记录?
-
#将按照姓名进行分组,并计算每个姓名出现的次数。然后,使用 HAVING 子句筛选出出现次数大于 1 的姓名,即找出所有姓名相同的记录 SELECT name, COUNT(*) as count FROM student GROUP BY name HAVING count > 1; #再做外层查询 SELECT name, student_id, class FROM student WHERE name IN ( SELECT name FROM student_info GROUP BY name HAVING COUNT(*) > 1 );
3,将表转为横向表
-
SELECT (@id := @id + 1) AS id, name, MAX(CASE WHEN course = '语文' THEN score END) AS 语文, MAX(CASE WHEN course = '数学' THEN score END) AS 数学, MAX(CASE WHEN course = '英语' THEN score END) AS 英语 FROM tb_student, (SELECT @id := 0) AS init GROUP BY name;
先根据name进行分组,再进行聚合
MAX(CASE WHEN course = ‘语文’ THEN score END) AS 语文 是一个条件表达式,用于计算语文成绩的最大值,并将结果命名为 “语文”。
满足条件 course = ‘语文’ 时返回对应的 score 值,否则返回 NULL。
使用 MAX() 聚合函数对这个条件表达式的结果进行聚合操作,以获取满足条件的最大值。如果没有满足条件的值,则返回 NULL。
添加一个递增的ID列 ,使用MySQL的自增变量和子查询来实现