说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

请高手给个效率更好 速度更快的查询 谢谢了

编辑:说三道四文库 发布时间:2018-08-18 04:50
HTML文档下载 WORD文档下载 PDF文档下载
有一个表data。结构是: 三个年级里的所有的班级的学生给他的每科的任课老师打分的,每个学生一条记录  
年级 班级 语文 数学 英语 科学  。。。  体育  电脑 
1    01   12   13   30   26             30   32  
1    01   12   13   30   26
。。。。
1    02   23   13   30   32             30   32
1    02   12   15   30   23             30   32
2    01   12   15   30   23             24   35 
3    05   25   45   24   35             64   17
3    08   24   54   64   17             45   24 


下面这句是我以前写的每个科目只去掉最高和最低的一个分数
set rs1=rsuser("SELECT nianji,banji,(sum(语文)-max(语文)-min(语文))/(count(*)-2) ,(sum(数学)-max(数学)-min(数学))/(count(*)-2),(sum(英语)-max(英语)-min(英语))/(count(*)-2),(sum(科学)-max(科学)-min(科学))/(count(*)-2) from data group by 年级,班级")


现在的要求是把每个班级每个科目的学生打老师分数的前10%和后10%去掉,再算余下的各个科目的老师的平均得分(每个科目去掉最高和最低的一批记录后不会是同样的记录)

所以我用了下面的语句,

set rs2=rsuser("select avg(kemu) from (select * from data where id not in(select top 10 percent id from data where nianji & banji='101' order BY " & kemu & ",id) and id not in(select top 10 percent id from data where nianji & banji='" & bj & "' order BY " & kemu & " desc,id)) where nianji & banji='" & bj & "'")
kemu有14个是个变量要循环起来,每个科目都要执行上面的查询一次,总的班级有40来个,所以类似上面的查询要执行40*14次,页面就显示超时了, 高手们能否给我效率更高速度更快的查询吗,请写出具体的代码或者思路,表的结构是变不了了。 先谢谢了
楼主最好说下数据库,简单写了下(未测,只是思路),用下分组(分析)函数就可以了。

select distinct banji,nianji,kemu,avg(kemu) over(partition by banji,nianji) --按班级年级求平均
from data
where rownumber() over(partition by banji,nianji,kemu order by kemu asc) >count(*) over(partition by banji,nianji,kemu) *0.1 and rownumber() over(partition by banji,nianji,kemu order by kemu asc)<count(*) over(partition by banji,nianji,kemu) *0.9 --过滤前10%和后10%
建议直接使用你的程序来计算,而不是用SQL语句来实现。 你可以在VB语句中打开全表,然后逐一记录处理计算。

你可以一次把一个班的数据全部读入数组,然后进行10%的统计处理。
我把你的语句放 access里测试了下,出错,avg(yuwen) over (partition by banji,nianji) 说什么语法错误,操作符丢失
引用 1 楼 fengyun817 的回复:
楼主最好说下数据库,简单写了下(未测,只是思路),用下分组(分析)函数就可以了。

SQL code

select distinct banji,nianji,kemu,avg(kemu) over(partition by banji,nianji) --按班级年级求平均
from data
where rownumber() over(partition by banji,nia……
纯粹用SQL不好实现,还是要结合程序来才好弄
不偷懒了 ,先把数据读到数组里,自己写代码排序处理了,看来偷懒也要不得啊
引用 4 楼 lzp4881 的回复:
纯粹用SQL不好实现,还是要结合程序来才好弄
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘