sql高频面试题-去除最高最低的平均

news/2025/3/19 11:21:41/

面试或者笔试的过程中会设定各种各样的场景,在这些场景下考查我们SQL的查询能力,但是万变不离其宗,业务场景只是一个表现形式,抽象为SQL问题后其实基本上就是几类问题:计算累计、连续,分类TopN等。只要掌握这些问题的解法,并且可以举一反三,并不需要盲目的花费大量的时间精力去刷题,多总结多思考,你就很容易在面试笔试环节脱颖而出了。

案例

#emp_salary 表记录了每个员工的月工资以及所属的部门,包含EmpId(员工ID)、Department(部门名称)、Salary(月工资)。

select 10001  empId , '市场部' department , 9000 salary into #emp_salary
 union all 
  select 10002  empId , '市场部' department , 8000 salary 
   union all 
  select 10003  empId , '市场部' department , 8600 salary 
   union all 
  select 10004  empId , '市场部' department , 8200 salary 
   union all 
  select 10005  empId , '市场部' department , 8500 salary 
     union all 
  select 10006  empId , '市场部' department , 7500 salary 
       union all 
  select 10007  empId , '运营部' department , 7300 salary 
       union all 
  select 10008  empId , '运营部' department , 7600 salary 
         union all 
  select 10009  empId , '运营部' department , 8600 salary 
           union all 
  select 10010  empId , '运营部' department , 8900 salary 
             union all 
  select 10011  empId , '运营部' department , 8900 salary 
         union all 
  select 10012  empId , '产品部' department , 7600 salary 
         union all 
  select 10013  empId , '产品部' department , 8600 salary 
           union all 
  select 10014  empId , '产品部' department , 8900 salary 
             union all 
  select 10015  empId , '产品部' department , 9000 salary 
  
  select * from #emp_salary

需求:计算除去部门最高工资,和最低工资的平均工资

因为要在每个部门内计算平均工资,但是要去除该部门的最高工资和最低工资,所以我们可以考虑使用窗口函数,按照部门进行分组,但是如何将部门的最高工资和最低工资去除呢?我们可以对分组后的数据按照工资分别顺序和逆序进行排序,排名第一的就分别是该部门最低和最高工资,将这2个排名第一的记录去除就是我们要计算的平均工资。

核心是使用窗口函数RANK分别对工资salary进行升序和降序排列,就获得了该分组内最低和最高的工资,过滤掉这2条记录再对工资salary进行平均avg即可

注意:用rank()排序时,相同的数据的排名也会重复(如下述代码运行结果),即最大值/最小值若有好几个,这几个都会去掉

select *,RANK() over(partition by department order by salary )  sa_asc
,RANK() over(partition by department order by salary desc )  sa_desc
 from #emp_salary

解题sql代码:

select department,AVG(salary) 平均工资
from (
    select *,RANK() over(partition by department order by salary )  sa_asc
    ,RANK() over(partition by department order by salary desc )  sa_desc
    from #emp_salary
)t 
where sa_asc!=1 and sa_desc !=1
group by department


  


http://www.ppmy.cn/news/1021558.html

相关文章

专注于创意设计,为您的小程序和网站建设带来更多的可能性

随着移动互联网的快速发展,越来越多的企业开始关注小程序和网站建设,以此来拓展业务和提升品牌形象。 在这个领域中,创意设计扮演着关键的角色。它不仅可以帮助企业打造独特的形象和品牌,还能够提高用户体验和购买决策的效率。 因…

MySQL到Oracle快速上手

第一次做Oracle项目的时候对一些语法区别不太清楚,这里列出一些开发中发现的与MYSQL不同的点 一个用户相当于一个数据库 表空间 表空间是用于存储表、索引和其他数据库对象的逻辑存储结构。每个表空间由一个或多个数据文件组成,这些文件可以位于不同的物…

背上大书包准备run之CSS篇

时隔一年多又要准备面试嘞。唉,人生呐,真是变幻莫测哟~ 社招应该不会问很多css吧,,,但是应该也会问吧,,,应该是从好多好多问题里只抽一两个问问吧😭 哦还有h5&#xff…

【行为型设计模式】C#设计模式之观察者模式

题目:假设你正在开发一个简单的新闻发布系统,该系统允许用户订阅不同的新闻频道,并在有新闻发布时向订阅者发送通知。使用观察者模式设计和实现该系统。观察者模式的相关概念和定义: 观察者模式是一种行为设计模式,它定…

windows使用/服务(13)戴尔电脑怎么设置通电自动开机

戴尔pc机器通电自启动 1、将主机显示器键盘鼠标连接好后,按主机电源键开机 2、在开机过程中按键盘"F12",进入如下界面,选择“BIOS SETUP” 3、选择“Power Management” 4、选择“AC Recovery”,点选“Power On”,点击“…

后端开发7.轮播图模块【mongdb开发】

概述 轮播图模块数据库采用mongdb开发 效果图 数据库设计 创建数据库 use sc; 添加数据 db.banner.insertMany([ {bannerId:"1",bannerName:"商城轮播图1",bannerUrl:"http://xx:8020/img/轮播图/shop1.png"}, {bannerId:"2"…

创建CREATE_STAT_TABLE 统计信息表在达梦和oracle中的使用

达梦 创建CREATE_STAT_TABLE 统计信息表 PROCEDURE CREATE_STAT_TABLE ( STATOWN VARCHAR(128), STATTAB VARCHAR(128), TABLESPACE VARCHAR(128) DEFAULT NULL, GLOBAL_TEMPORARY BOOLEAN DEFAULT FALSE ); 创建普通表的对应系统表的列名字段包括以下: OWNER TABL…

Flutter:文件上传与下载(下载后预览)

Dio dio是一个强大的Dart Http请求库,提供了丰富的功能和易于使用的API,支持文件上传和下载。 这个就不介绍了,网上有很多的封装案例。 background_downloader 简介 适用于iOS,Android,MacOS,Windows和L…