| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 537 人关注过本帖
标题:各位大侠,使用SQL语句能否一次性取得各班成绩前20%的学生的信息
只看楼主 加入收藏
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10961
专家分:43601
注 册:2014-5-20
收藏
得分:0 
回复 9楼 schtg
我只是一个算法,具体数据按实际情况去组织,按班算就算 班的记录数*20%


3 天前 08:14
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10961
专家分:43601
注 册:2014-5-20
收藏
得分:0 
回复 10楼 my2318
3楼提到的问题,如果20%中最后一个与跟随其后面的一个成绩相同就有问题。
3 天前 08:18
schtg
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:Usa
等 级:贵宾
威 望:67
帖 子:2367
专家分:4881
注 册:2012-2-29
收藏
得分:0 
我知道基本上只能先分班获取再合成一个新表,谢谢各位!
3 天前 19:47
yiyanxiyin
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:9
帖 子:343
专家分:2340
注 册:2023-6-29
收藏
得分:0 
SELECT
    s1.class_id,
    s1.student_id,
    s1.student_name,
    s1.score
FROM students s1
WHERE (
    -- 计算比当前学生成绩高的同班学生数
    SELECT COUNT(*)
    FROM students s2
    WHERE s2.class_id = s1.class_id
      AND s2.score > s1.score
) < (
    -- 计算班级总人数的20%(向上取整)
    SELECT CEIL(COUNT(*) * 0.2)
    FROM students s3
    WHERE s3.class_id = s1.class_id
)
ORDER BY s1.class_id, s1.score DESC;
看看这个思路
3 天前 19:49
schtg
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:Usa
等 级:贵宾
威 望:67
帖 子:2367
专家分:4881
注 册:2012-2-29
收藏
得分:0 
回复 14楼 yiyanxiyin
谢谢!试一试哈。
3 天前 19:55
chychychy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:466
专家分:178
注 册:2015-4-18
收藏
得分:0 
想法是先按班级排名,再计算班级总人数的20%,取班级排名小于这个数字的。新手的语句有点啰嗦,就当抛砖引玉吧
参考自:编程论坛 - 求助:SQL语句
https://bbs.bc-cn.net/thread-381677-1-184.html
程序代码:
* 增加一个bjmc字段,记录班级排名
SELECT *,00000 AS bjmc FROM stu INTO CURSOR temp1 READWRITE
UPDATE temp1 SET bjmc=(SELECT COUNT(*)+1 FROM temp1 AS B WHERE B.成绩>temp1.成绩 AND B.班级=temp1.班级)

* 生成班级人数总人数和前百分20 人数统计表。

SELECT 班级, COUNT(*) AS zrs, ;
        CEILING(COUNT(*) * 0.2) AS ncount20 ;
FROM stu ;
WHERE NOT EMPTY(班级) ;
GROUP BY 班级 ;
INTO CURSOR tempbj

BROWSE &&& 测试查看用

* 创建空临时表结构
SELECT * FROM temp1 ;
    WHERE .F. ;
    INTO CURSOR TEMP2 READWRITE

* 循环处理每个班级,直接使用tempbj表统计的数值
SELECT tempbj
SCAN
* 从tempbj中直接获取总人数和前百分之20人数。
    nCount = tempbj.zrs
    nCount20 = tempbj.ncount20

* 取前百分之20的学生
    SELECT * FROM temp1 ;
        WHERE (temp1.班级) = (tempbj.班级) ;
        AND NOT EMPTY(班级) ;
        AND bjmc <= nCount20 ;  && 排名小于等于前20%的人数
        ORDER BY 成绩 DESC ;
        INTO ARRAY bjzf

* 追加到临时表
    SELECT TEMP2
    APPEND FROM ARRAY bjzf
ENDSCAN

* 显示结果
SELECT TEMP2
GO TOP
BROWSE &&& 测试查看用




[此贴子已经被作者于2025-12-15 14:16编辑过]

前天 10:13
schtg
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:Usa
等 级:贵宾
威 望:67
帖 子:2367
专家分:4881
注 册:2012-2-29
收藏
得分:0 
回复 16楼 chychychy
非常感谢!
前天 12:31
chychychy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:466
专家分:178
注 册:2015-4-18
收藏
得分:0 
回复 16楼 chychychy
数据量一大速度就慢了,从9000多记录里面找,大约3.7秒(vfp9.0 sp1;win10;Intel(R) Core(TM) i5-10500 CPU @ 3.10GHz )
zcj.rar (219.67 KB)

程序代码:
**2025年12月15日,整理测试
**来自:编程论坛 - 各位大侠,使用SQL语句能否一次性取得各班成绩前20%的学生的信息
**https://bbs.bc-/viewthread.php?tid=514644&page=2&extra=page%3D1#pid2795494
t1=Seconds()&&计时函数
** 增加一个bjmc字段,记录班级排名
SELECT *,00000 AS bjmc FROM zcj INTO CURSOR temp1 READWRITE
UPDATE temp1 SET bjmc=(SELECT COUNT(*)+1 FROM temp1 AS B WHERE B.zcj>temp1.zcj AND B.bj=temp1.bj)

** 生成bj人数总人数和前百分20人数统计表。

SELECT bj, COUNT(*) AS zrs, ;
    CEILING(COUNT(*) * 0.2) AS nCount20 ;
    FROM zcj ;
    WHERE NOT EMPTY(bj) ;
    GROUP BY bj ;
    INTO CURSOR tempbj

*BROWSE TITLE "bj总人数和前百分之20人数"  &&& 测试查看用

* 创建空临时表结构
SELECT * FROM temp1 ;
    WHERE .F. ;
    INTO CURSOR TEMP2 READWRITE

* 循环处理每个bj,直接使用tempbj表统计的数值
SELECT tempbj
SCAN
* 从tempbj中直接获取总人数和前百分之20人数。
    nCount = tempbj.zrs
    nCount20 = tempbj.nCount20

* 取前百分之20的学生
    SELECT * FROM temp1 ;
        WHERE (temp1.bj) = (tempbj.bj) ;
        AND NOT EMPTY(bj) ;
        AND bjmc <= nCount20 ;  && 排名小于等于前20%的人数
    ORDER BY zcj DESC ;
        INTO ARRAY bjzf

* 追加到临时表
    SELECT TEMP2
    APPEND FROM ARRAY bjzf
ENDSCAN

Messagebox("完成!共运行:"+Transform(Seconds()-t1)+"秒",64, "计时信息") &&计算用时多少
* 显示结果
SELECT TEMP2
GO TOP
BROWSE &&& 测试查看用
前天 15:29
schtg
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:Usa
等 级:贵宾
威 望:67
帖 子:2367
专家分:4881
注 册:2012-2-29
收藏
得分:0 
回复 18楼 chychychy
辛苦啦,非常感谢!
前天 15:40
快速回复:各位大侠,使用SQL语句能否一次性取得各班成绩前20%的学生的信息
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.042793 second(s), 11 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved