首页 > 其他分享 >高级查询

高级查询

时间:2022-09-04 12:22:51浏览次数:67  
标签:返回 sal 薪水 over 高级 查询 员工 select

  本篇文章示例介绍的查询操作不同于其他查询操作,它们体现了不同的查询思路,需要以每次一页的方式显示结果集。

 

1.在结果集中翻页

  问题:返回员工表中薪水排名前五的员工,然后再返回接下来排名前五的员工。

  解决方案:这个问题看起来很简单,只需要根据“薪水”这一列进行倒序排序,然后分页操作即可。但是如果存在重复数据时就会有问题。

  先按照“薪水”这一列进行倒序排序:

  

 

  然后分页取排名前五的数据:

  

 

 

   看似没问题,但是题目要求返回的是薪水排名前五的数据。因为这里有薪水相同的数据,返回的数据其实不止五条。应该返回下面框起来的数据:

  

 

 

   遇到这种情况,需要使用窗函数 rank() over 给每条数据进行排名(当前行在其分区内的排名,有间隙。要无间隙可以使用 dense_rank 。不使用ROW_NUMBER() ,该函数不区分使用并列),然后使用 between and 语法分页。

select * from (
SELECT *,rank() over(order by SAL desc) as rn FROM test.emps ) a where rn between 1 and 5

  

 

 

 

2.在表中跳过 n 行数据

  问题:以每次跳过一人的方式返回员工表中的数据。换言之,想返回第一个员工,第三个员工 ......

  解决方案:先对结果集排序,否则不存在“第一个”,“第二个”,“下一个”的概念。然后使用窗函数 ROW_NUMBER() 给每一行进行编号,再结合这些编号和求模函数 mod() 跳过不想返回的行。

select *,mod(rn,2) from (
select *,row_number() over(order by id) as rn from emps ) a
where mod(rn,2) = 1

  

 

 

 

3.确定哪些行是互逆的

  问题:有一张包含两次考试结果的表,想确定哪两组成绩是互逆的。

  

 

 

   从这些数据可知,Test1 为70、Test2 为90与Test1 为90、Test2 为70 是互逆的。Test1 为20、Test2 为20与Test1 为20、Test2 为20 是互逆的。希望返回如下结果:

  

 

 

   解决方案:使用自连接找出这样的行,即一行的 Test1 和Test2 与 另一行的 Test2和Test1 相等。然后去重。

SELECT a.test1,a.test2 FROM test.grades a
join test.grades b on a.test1=b.test2 and a.test2 = b.test1
where a.id < b.id

  这里使用 a.id < b.id 去重。

 

4.平移行值

  问题:返回每位员工的姓名,薪水,下一个更高和更低的薪水值。如果没有更高或更低的薪水值,就执行回转操作。即如果当前员工的薪水是最低的,则将它的下一个更低的薪水值设置为最高的薪水;如果当前员工的薪水是最高的,就将它的下一个更高的薪水设置为最低的薪水。

  解决方案:使用窗函数 Lead over 和 Lag over 可以轻松取到前一行和后一行数据。然后使用 min 和 max 获取最小和最大值。

  第一步:取下一行数据的薪水作为当前行的下一个更高的薪水,取上一行的薪水作为下一个更低薪水

select ename,sal,lead(sal) over(order by sal) 下一个更高的薪水,lag(sal) over(order by sal) 下一个更低薪水 from emps

  

 

 

   第二步:处理第一行和最后一行

select ename,sal,
coalesce( lead(sal) over(order by sal),min(sal) over()) 下一个更高的薪水,
coalesce( lag(sal) over(order by sal),max(sal) over()) 下一个更低薪水 from emps

  

 

 

 

5.消除重复行

  问题:找出员工表中不同的部门编号,但不想看到重复的行。

  解决方案:最简单的方法是使用 distinct 关键字或者使用 group by 。另一种解决方法是,使用窗函数 row_number over 。

select * from (
select DeptNo,row_number() over(partition by  DeptNo order by deptno) as rn  from emps ) a
where rn = 1

  row_number() over(partition by  DeptNo order by deptno) as rn 根据部门编号分区,给分区内每一行进行编号。然后取分区内第一行。

  

 

 

 

6.查找马值

  问题:返回一个结果集,包含员工名字、部门编号、薪水、获聘日期以及所属部门最后聘请的员工的薪水。

    所属部门最后聘请的员工的薪水就是马值,因为查找这些值的方法与国际象棋中马的走法类似。先跳到某一行,然后跳到某一列。同样,要找到所属部门最后聘请的员工的薪水,必须先定位到最后获聘日期所在的行,然后获取该行的薪水值。

  解决方案:使用  max(HireDate) over(partition by DeptNo)  和 case when 语法找出所属部门最后聘请的员工。再次使用 Max Over 获取所属部门最后聘请的员工的薪水值。

select DeptNo,Ename,Sal,HireDate, max(Lastest_Sal) over(partition by DeptNo) from (
select DeptNo,Ename,Sal,HireDate,
case  max(HireDate) over(partition by DeptNo) 
    when HireDate then SAL else 0 
    end  as Lastest_Sal
    from emps ) a

 

7.生成简单预测

  问题:根据当前的数据返回表示未来行动的行和列。例如,下面有三行订单数据:

  

 

   每行数据包含下单日期和处理日期(下单两天后)。现在想对每行数据都返回三行(当前行和另外两行),还想返回另外两列,订单核验日期(订单处理一天后)和发货日期(订单核验一天后)。并且想返回一个呈现整个过程的结果集,下图的样子:

  

 

   

  解决方案:使用笛卡尔积为每行订单再生成两行树,然后使用 Case 表达式来创建所需的列值。

with recursive t3 (n) as
(
    select 1 as n
    union all
    select n+1 from t3 where n< 3
)


select id, OrderDate 下单日期,processDate 处理日期, 
case when n >= 2 then adddate(OrderDate,interval 1 day)
    else '' end as 核验日期,
case when n>2 then adddate(OrderDate,interval 2 day)
    else '' end as 发货日期
 from orders o
join t3

 

标签:返回,sal,薪水,over,高级,查询,员工,select
From: https://www.cnblogs.com/afei-24/p/16652795.html

相关文章

  • Unix环境高级编程
     1.acct是一个工具包,里面包含有​针对用户连接时间、进程执行情况等进行统计​的工具。它可以​记录用户登录信息。用户所执行的程序,程序执行情况信息​等。acct包含以......
  • Ubuntu下使用apt-get命令查询并安装指定版本的软件
    执行以下命令,查询软件所有的版本号sudoapt-cachemadison<package><package>为需要安装的包名,返回结果第二列即可用的版本号执行以下命令,安装指定版本的软件sudoapt......
  • 高级语言
    高级语言大体分为:面向过程和面向对象两大类各种语言:C语言C++语言Java语言服务器的开发C#语言 Csharp语言python 大数据提取PHP 网页制作JavaScript  ......
  • 子查询和嵌套查询
    --JAVA第一学年课程成绩排名前十的学生,并且分数要大于80的学生信息(学号,姓名,课程名称,分数)SELECTs.studentNo,studentName,subjectName,studentResultFROMst......
  • 查询字节串编码类型的模块chardet
    这个模块需要安装wgethttps://files.pythonhosted.org/packages/fc/bb/a5768c230f9ddb03acc9ef3f0d4a3cf93462473795d18e9535498c8f929d/chardet-3.0.4.tar.gz解......
  • 9.2 字符串的常用操作_字符串的查询操作
     '''集合的生成式'''s='hello,hello'print(s.index('lo'))#3print(s.find('lo'))#3print(s.rindex('lo'))#9print(s.rfind('lo'))#9'''如果查找不存......
  • mapper接口和xml文件都么有问题,但是查询不出数据
    mapper接口和xml文件都么有问题,但是查询不出数据在开发的时候遇到mapper.接口及xml文件都没有问题,控制台输出sql及参数也是正常的,但是total数据是0,那么看一下项目当前......
  • 【MySQL】order by引起的慢查询问题总结
    最近遇到了一个SQL没有走索引导致出现慢查询的问题,SQL本身很简单,两张表联合查询然后进行排序和分页,由于涉及到一些业务,这里以用户表和订单表为例,用户表数据在35W左右,订单表......
  • 自连接及联表查询练习
    自连接:自己的表和自己的表连接核心:把一张表拆分成两张一样的表即可--查询父子信息SELECTcategoryNameAS'父栏目',categoryNameAS'子栏目'fromcategoryASa,c......
  • Elasticsearch 查询 UV
    ES聚合指标value_count:计数cardinality:去重计数avg:平均值sum:求和max:最大值min:最小值percentiles:百分比top_hits:简单来说就是聚合分组后从每一个......