INTERVAL()函数与聚合函数并用

在MYSQL中INTERVAL()的定义是:
INTERVAL(N,N1,N2,N3,……)
INTERVAL()函数进行比较列表(N1,N2,N3……)中的N值,返回值是段的位置。
但是这些N1,N2,N3一般情况下常量。
如果改成集合函数如:

以学生ID,和班级ID为分组条件

SELECT 
-- 平均值保留两位
ROUND(AVG(PF_SCORE),2),
-- 平均分数向下偏离30%
ROUND(AVG(PF_SCORE)*0.7,2),  
-- 平均分数向上偏离30%
ROUND(AVG(PF_SCORE)*1.3,2), 
 -- 成绩集合以逗号分隔排序显示,正序
GROUP_CONCAT(PF_SCORE ORDER BY PF_SCORE ASC),
-- 总数量,准备用来比较和INTERVAL返回的段位置是否相等
-- COUNT(1), 
-- INTERVAL 比较最小偏离值是否大于最小值,正序
INTERVAL(CONCAT(ROUND(AVG(PF_SCORE)*0.9,2)),GROUP_CONCAT(PF_SCORE ORDER BY PF_SCORE ASC)), 
-- INTERVAL 比较最大偏离值是否大于最大值,倒叙
INTERVAL(CONCAT(ROUND(AVG(PF_SCORE)*0.9,2)),GROUP_CONCAT(PF_SCORE ORDER BY PF_SCORE DESC)) 
FROM `EXPERT_PF` 
-- 分组
GROUP BY STUDENT_ID,CLASS_ID

在这里插入图片描述

但是有个问题INTERVAL()函数会把里面的函数GROUP_CONCAT()作为一个字段,所以需要用到的排序不一样。我的想法是如果平均分数偏离最小值小于分数的最小值,那么就没有超过偏离,如果平均分数偏离最大值比分数的最大值还大那么也不会偏离。
至于将GROUP_CONCAT()的分数集合,每个都比一遍得出结果,在官网上未找到答案。
但是在测试的时候发现如果INTERVAL()将GROUP_CONCAT()是视为一个字段的话,那么这样也是可以成立的:

INTERVAL(CONCAT(ROUND(AVG(pf_score)*1.3,2)),GROUP_CONCAT(pf_score order by pf_score desc),GROUP_CONCAT(pf_score order by pf_score desc)) as deviate,
ELT(2,GROUP_CONCAT(pf_score order by pf_score desc),'2')

ELT()取值处理的是“2”,确实是将GROUP_CONCAT()视做了一个参数,但是还是起不到每个都遍历的作用。

另外INTERVAL当关键词使用时,表示为设置时间间隔,请参考:

https://blog.csdn.net/weixin_44641729/article/details/103793995

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

engr_chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值