sql实现在评分记录集中去掉最高、最低百分之N评分记录

智能手机参数数据分析:用SQL挖掘商业洞察 智能手机参数不仅是硬件指标,更是市场策略的数字化映射。从处理器核心数、电池容量到屏幕刷新率,这些结构化字段共同构成用户决策模型与品牌竞争图谱。基于标准SQL的数据分析方法,能高效实现多维聚合、滚动求和与分层排名,尤其适合宽表型硬件数据集;窗口函数(如DENSE_RANK、SUM OVER)可动态揭示市场梯队、价格带健康度与产品力水位线。该方法广泛应用于竞品监控、选品策略、渠道定位及用户分群等真实业务场景,为产品经理、数据分析师与运营团队提供可落地的技术洞察。 阅读详情

sql的优势之一是使用单一的命令能够访问到一个记录集,其重要的特点就是非过程化。

        在很多企业流行着360评分体系。比如,有A、B、C三个员工竞选某要职,HR组织吃瓜群众位对其三位进行评分,出于不清楚的原因,HR在拿到群众们的评分结果后,会先对某侯选人的得分结果记录集进行排序,再按比例去掉记录两头(最高、最低)的N%评分记录,最后再进行后续计算。

        本文是直接解决以上的“去掉记录两头的N%评分记录”的问题的。最少有以下几种方案:

      (本文代码基于SQL Server2005,关于@tb_eval表变量的定义见本文最后的附录)

-- 去掉最高20%、最低20%评分

select *
from
@tb_eval a01
where a01.id not in (select top 20 percent id from @tb_eval a02 where a01.empid=a02.empid order by a02.score desc)
and a01.id not in (select top 20 percent id from @tb_eval a02 where a01.empid=a02.empid order by a02.score asc)
order by empid, score desc

 

-- 去掉最高20%、最低20%评分

select * 
from 
(
	select row_number() over (partition by empid order by score desc) rowno, *
	from @tb_eval
) a01
where rowno > (select cast(round(count(*)*0.2,0) as int) padcnt from @tb_eval a02 where a01.empid=a02.empid)
and rowno <= (select (count(*) - cast(round(count(*)*0.2,0) as int)) padcnt from @tb_eval a02 where a01.empid=a02.empid)

 

-- 去掉最高20%、最低20%评分

select a01.*
from 
(
	select row_number() over (partition by empid order by score desc) rowno, *
	from @tb_eval
) a01
left join 
(
	select empid, cast(round(count(*)*0.2,0) as int) topcnt, cast(round(count(*)*0.2,0) as int) lastcnt, count(*) as totalcnt 
	from @tb_eval 
	group by empid
) a02
on a01.empid=a02.empid
where a01.rowno>a02.topcnt and a01.rowno <= (a02.totalcnt - a02. lastcnt)

  

本问题其实像是大学时代的课后练习作业,写作本文的原因主要是想说明sql的非过程化,你不应该使用游标去完成本任务。

 附录:

1、完整的代码

-- 人员表(本例不使用)
declare @tb_emp table table
(
    id    int,				-- 人员ID
    name    varchar(64)		-- 人员名称
);

insert into @tb_emp (id, name) values(1, 'emp01');
insert into @tb_emp (id, name) values(2, 'emp02');
insert into @tb_emp (id, name) values(3, 'emp03');
insert into @tb_emp (id, name) values(4, 'emp04');
insert into @tb_emp (id, name) values(5, 'emp05');
insert into @tb_emp (id, name) values(6, 'emp06');
insert into @tb_emp (id, name) values(7, 'emp07');
insert into @tb_emp (id, name) values(8, 'emp08');
insert into @tb_emp (id, name) values(9, 'emp09');
insert into @tb_emp (id, name) values(10, 'emp10');
insert into @tb_emp (id, name) values(11, 'emp11');
insert into @tb_emp (id, name) values(12, 'emp12');
insert into @tb_emp (id, name) values(13, 'emp13');
insert into @tb_emp (id, name) values(14, 'emp14');
insert into @tb_emp (id, name) values(15, 'emp15');
insert into @tb_emp (id, name) values(16, 'emp16');
insert into @tb_emp (id, name) values(17, 'emp17');
insert into @tb_emp (id, name) values(18, 'emp18');
insert into @tb_emp (id, name) values(19, 'emp19');
insert into @tb_emp (id, name) values(20, 'emp20');
insert into @tb_emp (id, name) values(21, 'emp21');
insert into @tb_emp (id, name) values(22, 'emp22');
insert into @tb_emp (id, name) values(23, 'emp23');
insert into @tb_emp (id, name) values(24, 'emp24');
insert into @tb_emp (id, name) values(25, 'emp25');


-- 评分表
declare @tb_eval table
(
	    id	int not null identity(1,1) primary key,		-- 评分表自动编号
	    empid int,						-- 被评分人员ID
	    score decimal(10, 2),				-- 评分
            examinerid int					-- 评分人员ID
);

-- 给empid为1, 3, 5的评分
insert into @tb_eval (empid, score, examinerid) values (1,9, 4);
insert into @tb_eval (empid, score, examinerid) values (1,76, 19);
insert into @tb_eval (empid, score, examinerid) values (1,37, 10);
insert into @tb_eval (empid, score, examinerid) values (1,90, 13);
insert into @tb_eval (empid, score, examinerid) values (1,29, 7);
insert into @tb_eval (empid, score, examinerid) values (1,6, 2);
insert into @tb_eval (empid, score, examinerid) values (1,69, 17);
insert into @tb_eval (empid, score, examinerid) values (1,76, 5);
insert into @tb_eval (empid, score, examinerid) values (1,60, 15);
insert into @tb_eval (empid, score, examinerid) values (3,13, 20);
insert into @tb_eval (empid, score, examinerid) values (3,49, 6);
insert into @tb_eval (empid, score, examinerid) values (3,72, 25);
insert into @tb_eval (empid, score, examinerid) values (3,84, 2);
insert into @tb_eval (empid, score, examinerid) values (3,4, 22);
insert into @tb_eval (empid, score, examinerid) values (3,17, 11);
insert into @tb_eval (empid, score, examinerid) values (3,74, 18);
insert into @tb_eval (empid, score, examinerid) values (3,66, 21);
insert into @tb_eval (empid, score, examinerid) values (3,62, 8);
insert into @tb_eval (empid, score, examinerid) values (3,4, 4);
insert into @tb_eval (empid, score, examinerid) values (3,66, 13);
insert into @tb_eval (empid, score, examinerid) values (3,41, 3);
insert into @tb_eval (empid, score, examinerid) values (3,94, 16);
insert into @tb_eval (empid, score, examinerid) values (5,87, 24);
insert into @tb_eval (empid, score, examinerid) values (5,71, 14);
insert into @tb_eval (empid, score, examinerid) values (5,39, 22);
insert into @tb_eval (empid, score, examinerid) values (5,55, 12);
insert into @tb_eval (empid, score, examinerid) values (5,13, 19);
insert into @tb_eval (empid, score, examinerid) values (5,73, 16);
insert into @tb_eval (empid, score, examinerid) values (5,45, 10);
insert into @tb_eval (empid, score, examinerid) values (5,9, 15);
insert into @tb_eval (empid, score, examinerid) values (5,4, 8);
insert into @tb_eval (empid, score, examinerid) values (5,31, 11);

-- 全部评分按empid分组后,每组从高到低评分
select row_number() over (partition by empid order by score desc) rowno, * 
from @tb_eval

-- 去掉最高20%、最低20%评分
select *
from 
@tb_eval a01 
where a01.id not in (select top 20 percent id from @tb_eval a02 where a01.empid=a02.empid order by a02.score desc) 
and a01.id not in (select top 20 percent id from @tb_eval a02 where a01.empid=a02.empid order by a02.score asc) 
order by empid, score desc 

-- 去掉最高20%、最低20%评分
select a01.*
from 
(
	select row_number() over (partition by empid order by score desc) rowno, * 
	from @tb_eval 
) a01 
left join 
(
	select empid, cast(round(count(*)*0.2,0) as int) topcnt, cast(round(count(*)*0.2,0) as int) endcnt, count(*) as totalcnt 
	from @tb_eval 
	group by empid 
) a02 
on a01.empid=a02.empid 
where a01.rowno>a02.topcnt and a01.rowno <= (a02.totalcnt - a02.endcnt) 

-- 去掉最高20%、最低20%评分
select * 
from 
( 
	select row_number() over (partition by empid order by score desc) rowno, * 
	from @tb_eval 
) a01 
where rowno > (select cast(round(count(*)*0.2,0) as int) padcnt from @tb_eval a02 where a01.empid=a02.empid) 
and rowno <= (select (count(*) - cast(round(count(*)*0.2,0) as int)) padcnt from @tb_eval a02 where a01.empid=a02.empid) 


2、未进行去头、去尾的结果: 

rowno

id

empid

score

examinerid

1

4

1

90

13

2

2

1

76

19

3

8

1

76

5

4

7

1

69

17

5

9

1

60

15

6

3

1

37

10

7

5

1

29

7

8

1

1

9

4

9

6

1

6

2

1

22

3

94

16

2

13

3

84

2

3

16

3

74

18

4

12

3

72

25

5

17

3

66

21

6

20

3

66

13

7

18

3

62

8

8

11

3

49

6

9

21

3

41

3

10

15

3

17

11

11

10

3

13

20

12

14

3

4

22

13

19

3

4

4

1

23

5

87

24

2

28

5

73

16

3

24

5

71

14

4

26

5

55

12

5

29

5

45

10

6

25

5

39

22

7

32

5

31

11

8

27

5

13

19

9

30

5

9

15

10

31

5

4

8


3、去头、去尾后的结果:

rowno

id

empid

score

examinerid

3

8

1

76

5

4

7

1

69

17

5

9

1

60

15

6

3

1

37

10

7

5

1

29

7

4

12

3

72

25

5

17

3

66

21

6

20

3

66

13

7

18

3

62

8

8

11

3

49

6

9

21

3

41

3

10

15

3

17

11

3

24

5

71

14

4

26

5

55

12

5

29

5

45

10

6

25

5

39

22

7

32

5

31

11

8

27

5

13

19




Text-to-SQL模型多候选查询选择:基于双范式一致性的高效筛选方法 在自然语言处理与数据库交互领域,Text-to-SQL技术旨在将人类自然语言问题自动转换为可执行的SQL查询语句,是实现数据民主化和智能数据访问的核心技术。其基本原理是通过序列到序列模型或大语言模型理解用户意图,并生成结构化的查询语言。这项技术的核心价值在于降低非技术人员的数据获取门槛,提升数据分析效率。在实际应用中,尤其是在复杂业务场景下,模型常会生成多个语法正确但逻辑或结构不同的候选SQL查询,如何从中选择最优解成为影响系统可靠性与性能的关键。本文聚焦于这一“最后一公里”问题,深入探讨了一种免训练的轻量 阅读详情

相关推荐

SQL去掉最大值与最小值求均值

今天遇到一道SQL题,SQL去掉最大值与最小值求均值,觉得不错,跟大家分享一下。 情况一:除去所有重复的最大值和重复的最小值,然后求平均 SELECT AVG(SALARY) FROM EMPLOYEES WHERE SALARY NOT IN ( (SELECT MIN(SALARY) FROM EMPLOYEES), (SELECT MAX(SALARY) FROM EMPLOYEES)) 情况二:最值存在多个重复值,仅需除去一个最大值和最小值,然后求平均值 SELECT (SUM(SALARY)

清平乐的技术专栏 3215

去掉最高分最低分求平均分

去掉最高分最低分求平均分

weixin_42587270的博客 3909

MySQL数据排序与限制

本课程讲解了如何使用SQL中的ORDER BYLIMIT和DISTINCT等关键字对数据进行排序、限制查询结果以及去除重复记录。通过合理使用这些关键字,可以有效提升数据库查询的效率和准确性,在处理大规模数据时尤为重要。数据的合理排序和限制返回记录是数据库优化和用户体验提升的关键。

Mr数据杨 786

有趣的SQL(如何去掉一个最高分,一个最低分)

通过以下SQL 可以实现去掉一个最高分一个最低分 而且即就是最高 最低分有重复的也可以实现。示例数据: 评委     歌手     得分 A 1 75 A 2

想念菲菲 5392

自考计算机系统原理(第六章计算机系统概论)-13015

名词解释 I/O 硬件 I/O软件 用户空间I/O软件 内核空间I/O 软件 系统调用处理程序 系统调用服务例程 设备驱动程序 中断服务程序 系统级1/O函数 虚拟文件系统 文件描述符 文件元数据 流缓冲区 索引节点 目录文件 目录项 系统打开文件表 磁盘高速缓存 高速缓存 RAM I / O 控制方式 程序直接控制I/O 就绪状态 中断控制I/O 中断屏蔽字 多重中断 中断嵌套 DMA 方式 DMA 控制器 设备控制器 I/O端口 控制端口 数据端口 状态端口 I/O 地址空间 独立编址方式 统一编址方

qq_23872947的博客 1150

sysrepo 开发者指南(一个基于libyang与支持rpc的数据库)

sysrepo 开发者指南(一个基于libyang与支持rpc的数据库) 日志记录 默认情况下,所有 Sysrepo 日志记录都处于关闭状态。如果启用,日志消息有 3 种输出。它们可以写入stderr、由 处理syslog或简单地传递给回调。 请务必注意,启用 Sysrepo 日志记录也会修改libyang日志记录设置。错误消息被视为标准 Sysrepo 错误,其他严重性较低的消息完全隐藏。要更改此行为,只需在启用 Sysrepo 日志记录后调整libyang日志记录设置。 此外,几乎每个 Sysrepo

weixin_43489394的博客 9229

oracle 最高分 最低分,oracle 去掉两个最高分,去掉两个最低分

同事有个需求,做个评分的功能,要求去掉两个最高分,去掉两个最低分,剩下的求平均分。oracle有对应的max,min,last,first,可惜,这回是去掉两个,而不是去掉一个,或许人家国外就没有这样的评分方法,呵呵。写了几种方法,原来是用row_number(),感觉麻烦,相比之下,认为这种方式最简单,借用了一下oracle的lag,lead函数。SQL> select aname,asc...

weixin_35936869的博客 893

天祥TX-1C单片机开发板-秒表程序

郭天祥TX-1C开发板实现秒表程序 附开发板图片和原理图 代码 #include <reg52.h> sbit key1=P3^4; //按键S2 sbit key2=P3^5; //按键S3 sbit U1=P2^6; //LED位选 sbit U2=P2^7; //LED片选 unsigned char code ledchar[]={ /...

Run_long_road 3513

mysql去掉两个最高分_mysql如何去除两个字段数据相同的记录

展开全部方法有62616964757a686964616fe59b9ee7ad9431333363373836很多,这里介绍两种方法一、如果要保留id的最小值,例如:数据:执行sql:select count(*) as count ,name,id from ceshi group by name&lt;img最后要删除的sql为:delete from ceshi where id n...

weixin_32746931的博客 322

《童虎学习笔记》5分钟用Keepalived搭建MySQL高可用实现虚ip自动漂移

1

tonghu_note的博客 5618

小红书私信接口与Hook技术实战:微信跳转卡片的合规与破解之道

本文深入探讨了小红书私信接口与Hook技术的实战应用,重点解析了微信跳转卡片的合规使用与破解方法。通过官方私信接口的合规玩法与Xposed框架的Hook技术对比,为开发者提供了技术选型指南和实战建议,帮助实现高效的用户跳转与转化。

weixin_30399821的博客 736

用Python整理317种EDM分支的RYM最高评分专辑

音乐评分平台记录了海量用户对专辑的喜好,其中风格分类的粒度往往超乎想象。Rate Your Music(RYM)作为老牌音乐数据库,其电子舞曲分支多达317种,每个分支下都沉淀了公认的经典作品。然而从这些细分类别中提取“最佳专辑”并非简单查询,涉及数据清洗、风格归一、评分过滤等环节。本文从数据分析的通用流程切入,介绍如何利用Python和pandas构建可复用的分析框架:先设计风格与专辑的双表结构,再通过映射统一异名风格,最后按评分人数阈值筛选并用排序算法定位每个风格的高分代表。该方法不仅适用于音乐评分数据

weixin_33835103的博客 351

CEEMDAN算法及其应用

本博文主要介绍CEEMDAN算法的原理及其在信号去噪方面的应用

总结论文中的算法并给出论文的复现代码 6万+

牛客网刷题 | SQL

文章目录入门SQL1 查询所有列SQL2 查询多列SQL3 查询结果去重SQL4 查询结果限制返回行数SQL5 将查询后的列重新命名SQL6 查找学校是北大的学生信息SQL7 查找年龄大于24岁的用户信息SQL8 查找某个年龄段的用户信息 入门 SQL1 查询所有列 select 表列名 from 表名 例如: select id,device_id,gender,age,university,province from user_profile 或者 select * from user_profile

qq_40933711的博客 3079

【2025最新版】Open3D 区域生长分割(python详细过程版)

点云区域生长分割算法的python详细过程版实现。博客长期更新,本文最新更新时间为:2025年3月23日。

点云侠的博客 9529

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

力扣sql刷题记录

​ 这题和上题一样,难度不大,主要需要看条件,不要漏掉已经给出的登上巴士的顺序,而像我一样算半天的重量反算,按照题目意思,首先使用窗口函数按照给出的顺序对重量进行求和,套一层循环判断加起来的重量小于等于给出的1000,写一个窗口函数进行取最大值,取到之后得出的结果即为最后一个不超过1000的重量的人,即最后一个能进入巴士的人。​ 筛选出所有登录在2020年的登陆记录,接着按照人员分组,求出每个人最大登陆时间,即为最后一次登录时间。

小章的编程日记 6726

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

SQL_boy的SQL查询长期训练,每日更新3~5题……

SQL长期训练贴。学习:知识的初次邂逅;复习:知识的温故知新;练习:知识的实践应用。

qq_55006020的博客 1335

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

BigQuery原生向量搜索:用SQL解决语义断层问题

语义断层是现代软件工程中配置漂移、文档缺失与跨系统理解失效的根源,本质是同一业务逻辑在Kubernetes YAML、COBOL代码、API Schema等异构工件中缺乏可验证的语义映射。传统RAG方案依赖独立向量数据库,带来高成本、高延迟与不可审计等工程瓶颈。BigQuery的VECTOR类型将语义能力下沉至数据底座,使向量成为可权限管控、可元数据治理、可SQL混合查询的一等公民。这种‘向量即列’范式,让SRE快速定位端口不一致、架构师对齐遗留系统字段、合规工程师验证IRS表结构成为标准SQL操作,真正实

dielucui7698的博客 378

SpringBoot+Vue数学建模论文阅卷系统:全栈开发与核心实现

在高校教学管理信息化进程中,如何高效处理半结构化、内容复杂的论文评审是一个普遍痛点。传统基于SpringBoot的后端开发框架,结合Vue等前端技术,为构建数字化评阅系统提供了成熟的技术方案。其核心原理在于通过模块化设计和前后端分离架构,将论文提交、分配、在线评阅、分数统计等流程系统化。这种技术组合的价值在于能够显著提升评审效率、保障过程客观性,并实现数据的集中管理与分析,尤其适用于数学建模、毕业设计等需要多维度主观评价的场景。本文聚焦于一个具体的数学建模论文阅卷系统项目,深入解析了其基于SpringBoo

weixin_34032792的博客 261

Text-to-SQL微调实战:开源大模型如何精准生成业务SQL

Text-to-SQL(文本到SQL)是实现数据民主化的核心技术,其本质是将自然语言查询可靠地转化为可执行的结构化查询语句。该能力依赖于模型对数据库Schema的深度理解、业务规则的准确建模以及生成结果的语法与语义双重正确性。相比Prompt Engineering或调用闭源API,端到端微调开源大语言模型(如Llama 3-8B)具备更高执行准确率、更低延迟和完全可控的数据合规性。关键技术挑战在于Schema序列化表达、词表适配业务字段、分层损失函数设计及面向业务逻辑的评估体系。本文聚焦真实工业场景下的微

weixin_33889245的博客 511

【LeetCode】SQL题单 持续更新......

LeetCode:SQL题单,有一部分和LeetCode 精选数据库70题重复,这里没有重复写了

guliguliguliguli的博客 979

LLM自优化流水线实战:用Best of N与LLM as Judge构建可控AI应用

在大语言模型应用开发中,如何确保输出稳定、可控是工程实践的核心挑战。其原理在于通过系统化工程方法,将模型的概率性生成转化为可观测、可评估、可优化的闭环流程。这一过程的技术价值在于显著降低模型“幻觉”,提升输出的一致性与可靠性,使其能够胜任对质量有严格要求的自动化任务。典型的应用场景包括自动生成产品描述、代码审查、客服话术质检与报告摘要等。本文以构建“文本转JSON”工具为例,详细阐述了如何通过**Best of N Sampling**策略生成多样候选,并利用**LLM as Judge**技术进行智能评估

weixin_29051245的博客 296

SQL查询从入门到精通:排序、聚合、分组、分页与多表关联全攻略

很多初学者在写SQL时都会遇到这样的困惑:明明数据就在表里,但就是查不出来想要的结果。排序乱了、统计错了、分组懵了、多表关联更是直接放弃……其实,SQL查询是有固定套路的。只要掌握了排序、聚合、分组、分页这四大金刚,再理解了多表关联的核心逻辑,80%的查询需求都能轻松搞定。本文基于真实教学笔记整理,手把手带你掌握DQL查询语言的核心知识点,包含大量可直接运行的实战案例。聚合函数又叫组函数或统计函数,用来对表中的指定列数据进行统计计算。聚合函数作用注意事项COUNT()统计记录数忽略NULL值。

qq_58109679的博客 241

Mysql入门到精通全集(SQL99)包含关系运算,软考数据库工程师复习首选

本文系统梳理了MySQL数据库的核心知识点,包括数据库基础概念、SQL语句分类、数据操作语言、数据定义语言、事务控制、存储引擎、索引、视图、数据库设计范式等。重点介绍了DQL查询语句的各种用法,如条件查询、分组查询、连接查询等,以及DDL语句的表操作和约束设置。同时详细讲解了触发器、存储过程、变量、流程控制等高级功能,并全面归纳了MySQL内置函数的分类和使用方法。全文结构清晰,内容全面,涵盖了MySQL数据库从基础到高级的核心技术要点,可作为MySQL学习的系统性参考文档。

渣渣盟的博客 1万+

SQL窗口函数实战指南

窗口函数是SQL中强大的分析工具,能够在保留原表行数的同时,基于数据窗口计算聚合值或排名信息。与普通聚合函数不同,窗口函数通过PARTITION BY分组、ORDER BY排序和窗口框架定义计算范围,实现分组排名、累计计算、移动平均等复杂分析。常见窗口函数包括聚合型(SUM/AVG)、排名型(ROW_NUMBER/RANK)和值函数(LAG/LEAD)。这些函数广泛应用于电商、金融等领域,大幅简化了原本需要多层子查询的复杂分析任务,提升SQL代码可读性和执行效率。

weixin_54482667的博客 593
上一篇: jdk版本导致的DB2异常:必需的字符转换器不可用。ERRORCODE=-4220, SQLSTATE=null
下一篇: [昨日调试] org.apache.jasper.JasperException: Unable to load class for JSP
smartcore
博客等级 码龄19年 30粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值