牛客网刷题遇到的问题。
试了下代码是没有问题,看错误提示是因为你的mysql版本应该是5.7.5以上的高版本,而5.7.5以上的高版本实现了对功能依赖的检测,默认的sql_mode中包含了ONLY_FULL_GROUP_BY属性,这个属性保证了select到的列都在group by中出现,即MySQL会拒绝执行 select list、HAVING condition或ORDER BY list引用既不在GROUP BY子句中被命名,也不在功能上依赖于GROUP BY列(由GROUP BY列唯一确定)的未聚合列的查询,在5.7.5之前,MySQL没有检测到功能依赖项,only_full_group_by在默认情况下是不启用的。关于前5.7.5行为的描述,请参阅MySQL 5.6参考手册
解决方式一:
-- 先查询SQL_MODE
select @@GLOBAL.sql_mode;
-- 根据查询结果查找结果中是否包含了only_full_group_by模式,如果有的话就要把它去掉
set @@GLOBAL.sql_mode="查询结果中其余剩余的mode"
方式二:
修改mysql配置文件,通过手动添加sql_mode的方式强制指定不需要ONLY_FULL_GROUP_BY属性
-- 找到sql_mode = ,查看是否存在ONLY_FULL_GROUP_BY属性,如果存在,清除掉
sql_mode="清除ONLY_FULL_GROUP_BY属性后的剩余不变"
方式三:
不用改配置,修改SQL语句即可:
SELECT
ANY_VALUE(DATE_FORMAT( submit_time, '%Y%m' )) AS submit_month,
ANY_VALUE(count( question_id )) AS month_q_cnt,
ANY_VALUE(COUNT( question_id ) / DAY (LAST_DAY( submit_time ))) AS avg_day_q_cnt
FROM
practice_record
GROUP BY
DATE_FORMAT(submit_time,'%Y%m');
方案来自 梦想橡皮擦 狂飙组基于 GPT 编写的 “程秘”
SELECT
DATE_FORMAT(submission_date, '%Y-%m') AS month,
COUNT(*) AS count,
COUNT(*) / DAY(LAST_DAY(submission_date)) AS daily_avg
FROM
table_name
WHERE
submission_date BETWEEN '2021-08-01' AND '2021-09-30'
GROUP BY
DATE_FORMAT(submission_date, '%Y-%m');
其中 table_name 需要替换为实际的表名。
这个查询语句会将指定时间范围内的数据按月分组,并计算每个月的刷题总数和每日平均刷题数。其中,DATE_FORMAT(submission_date, '%Y-%m') 可以将 submission_date 字段格式化为年月格式,COUNT(*) 统计每个月的记录数,DAY(LAST_DAY(submission_date)) 计算每个月的天数,从而得到每日平均刷题数。
重要知识点:MySQL 的日期函数、分组查询。
se标准sql要求select字句中不能出现非分组字段