对一张表进行运算:要算出每一个人,在每一个学科的最高分,以及获得最高分对应的时间。
A B C D
张三 语文 89 2023-2-1
张三 语文 78 2023-2-7
张三 语文 76 2023-1-30
张三 数学 76 2023-1-30
张三 数学 96 2022-12-4
现在查询是这么写的,
SELECT A, B,MAX(C), D
FROM table1
GROUP BY A,B;
结果发现D列的结果是错误的,就是说返回的不是对应行的时间。
请问这是什么原因造成的?
另外软件是mysql,默认设置里面,如果直接select没有聚合过的列会报错(Error Code: 1055.Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column),使用set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';和set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';两个命令解除的。
group by a,b 那么a,b以外的其它列必须出现在聚合函数中。可以去掉d,查询当做子查询,然后关联原表查询d,关联条件就是聚合查到的那几列
select * from (
select *,row_number() over(partition by a,b order by c desc) rid from tb
) a
where rid=1
MAX(C)的逻辑用一个where子句代替,这样应该也可以拿到对应的D