牛客网数据库sql实战剖析(三)

1. 删除emp_no重复的记录,只保留最小的id对应的记录。

按照emp_no分组,找出最小的id。然后delete 掉不在最小id中的数据。
注意不能一边删一边查找,错误方法:

DELETE FROM titles_test
WHERE id NOT IN(SELECT MIN(id)FROM titles_testGROUP BY emp_no);
MySQL中不允许在子查询的同时删除表数据(不能一边查一边把查的表删了)

正确做法:

DELETE FROM titles_test
WHERE id NOT IN(SELECT * FROM(SELECT MIN(id)FROM titles_testGROUP BY emp_no)a);  -- 把得出的表重命名那就不是原表了

2.平均工资

方法1:筛选掉最高工资和最低工资,然后用avg函数。(这个比较严谨)
select avg(salary) as avg_salary from salaries
where to_date = '9999-01-01'
and salary not in (select max(salary) from salaries where to_date = '9999-01-01')
and salary not in (select min(salary) from salaries where to_date = '9999-01-01')
方法2:纯用数学公式(不严谨,因为有最大最小值重复的情况)
select (sum(salary)-max(salary)-min(salary))/(count(1)-2) avg_salary
from salaries
where to_date='9999-01-01';

3.分页查询employees表,每5行一页,返回第2页的数据

若每页显示n条记录,要显示第i页数据,则可以用 limit n*(i-1),n
因此,得到如下代码:

select * from employees
order by emp_no
limit 5*(2-1),5;

4.获取有奖金的员工相关信息。

用case when的方式实现

select e.emp_no,first_name,last_name,btype,salary,
(case when eb.btype=1 then s.salary*0.1when eb.btype=2 then s.salary*0.2else s.salary*0.3 end) bonus
from 
employees e 
left join  emp_bonus eb
on e.emp_no=eb.emp_no
left join salaries s
on eb.emp_no=s.emp_no
where to_date="9999-01-01"
order by e.emp_no;

5.统计salary的累计和running_total (开窗)

按照排序号的emp_no开窗,然后求和即可。注意sum和over后面的括号不需要空格。另外开窗函数over后面可以单独使用partition by 或者order by等等。

select emp_no,salary,
sum(salary) over(order by emp_no) running_total
from salaries
where to_date = '9999-01-01'

6.给出employees表中排名为奇数行的first_name (开窗)

按照first_name开窗得到rownum,然后和原来的表关联后取技术行。

select e.first_name
from employees e
left join 
(select first_name,
row_number() over(order by first_name) rownum
from employees) t
on e.first_name=t.first_name
where t.rownum % 2!=0

7. 牛客每个人最近的登录日期(二)

查询每个用户最近一天登录的日子,用户的名字,以及用户用的设备的名字。(在聚合时无法同时查找用户的名字和设备的名字,所以不能用group b’y和max组合查找)

方式一:几张表连接好,然后直接用in语句来筛选出嘴的日期。
select u.name u_n,c.name c_n,l.date
from login l
join user u
on u.id=l.user_id
join client c
on c.id=l.client_id
where (l.user_id,l.date)in (select user_id,max(date) maxdate from login group by user_id)
order by u.name方式二:使用开窗找到每个用户的最近登录日期,然后用where筛选出只有最近登录日期的数据。另外这里是直接通过where条件来连接几张表,效率比join on低,但是看起来比较简单。这种方式不普遍,看看就行。
select user.name, client.name, d date
from user,
client,
(select *, max(date) over(partition by user_id) d from login) t
where user.id = t.user_id
and client.id = t.client_id
and t.date = t.d
order by user.name

8.牛客每个人最近的登录日期(三)

计算新登录用户次日成功的留存率,这题不方便开窗
思路:用户和首次登录日期在下一次登录日期中也存在即可。

select 
round(count(distinct user_id)*1.0/(select count(distinct user_id) from login) ,3)
from login
where (user_id,date)
in (select user_id,DATE_ADD(min(date),INTERVAL 1 DAY) from login group by user_id);

9.牛客每个人最近的登录日期(四)

查询每个日期登录新用户个数。
思路:开窗后使用case when。
select date,sum(case when rn=1 then 1 else 0 end ) s
from (select user_id,date,dense_rank() over(partition by user_id order by date) rn
from login) a
group by date

10.牛客每个人最近的登录日期(六)

截止到某天,累计总共通过了多少题
思路:左连接,开窗(开窗时注意按照日期排序)

select u.name,pn.date,
# pn.number,
sum(pn.number) over(partition by u.name order by date)
from passing_number pn
left join user u
on pn.user_id=u.id
order by pn.date

11.考试分数(一)

查询各个岗位分数的平均数,并且按照分数降序排序,结果保留小数点后面3位(3位之后四舍五入):
思路:单纯分组聚合即可。

select job,round(avg(score) ,3) avgscore
from grade
group by job
order by avgscore desc

12.考试分数(二)

查询用户分数大于其所在工作(job)分数的平均分的所有属性

方法一:开窗函数
select a.id,a.job,a.score from (
select id,job,score,avg(score) over(partition by job) ac
from grade
) a
where a.score > a.ac方法二:按组求出平均分,判断分数大于平均分的数据。用where子查询,子查询中使用where连接两张表
SELECT g.id,g.job,g.score
FROM grade g
WHERE g.score > (SELECT AVG(score)FROM grade g1WHERE g.job = g1.jobGROUP BY job)
ORDER BY id ASC;方法三:按组求出平均分,并且加上job形成一张表。然后关联原表,用where判断大于平均分的数据
select g.id,g.job,g.score from 
grade g
left join 
(
select job,round(avg(score) ,3) avgscore
from grade
group by job
) a
on g.job=a.job
where g.score>a.avgscore

13.考试分数(三)

找出每个岗位分数排名前2名的用户
思路:开窗后找出排名前2的language_id 。

select a.id,l.name,a.score from 
(select id,language_id,score,dense_rank() over(partition by language_id order by score desc) rn
from grade ) a
join language l
on a.language_id=l.id
where a.rn<=2 
order by l.name,a.score desc,a.id

14. 牛客的课程订单分析(二)

查询在2025-10-15以后,同一个用户下单2个以及2个以上状态为购买成功的C++课程或Java课程或Python课程的user_id(只需要user_id单列)。
思路:在要求的输出内容为单一可以聚合的字段的情况下只需要用简单的group,having就能筛选出内容。涉及到多个字段不能聚合的情况很多时候就是要用到开窗的,看15题牛客的课程订单分析(三)。

#正常方式
select user_id
from order_info
where date > "2025-10-15"
and status = "completed"
and product_name in ("C++","Java","Python")
group by user_id
having count(status)>=2
order by user_id;#要想直接用开窗也可以,但在这个单一聚合字段的情况就显得多余了,还要嵌套一层。
select distinct(user_id)
from
(
select *,count(*) over(partition by user_id) as c
from order_info
where date > '2025-10-15'
and status ="completed"
and product_name in ("C++","Java","Python")
) a
where a.c>=2
order by user_id;

15.牛客的课程订单分析(三)

查询在2025-10-15以后,同一个用户下单2个以及2个以上状态为购买成功的C++课程或Java课程或Python课程的订单信息(订单的所有信息,多列),所以用开窗比较合适。

select id,user_id,product_name,status,client_id,date from 
(
select *,count(status) over(partition by user_id ) c
from order_info
where date>'2025-10-15'
and status = 'completed'
and product_name in("C++","Java","Python")
) a
where a.c>=2
order by id

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/200421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】mkdir 命令使用

mkdir命令 mkdir&#xff08;英文全拼&#xff1a;make directory&#xff09;命令用于创建目录。 著者 作者&#xff1a;David MacKenzie。 mkdir命令 -Linux手册页 语法 mkdir [参数] [文件名] 命令选项及作用 执行令 &#xff1a; mkdir --help 执行命令结果 参数 …

Mycat关键配置记录

一、schema.xml文件配置 1、<schema>标签 name属性 mycat逻辑库的数据库名称 checkSQLschema属性 校验SQL是否带了schema。默认为false&#xff1b; 当设置为true时&#xff0c;会自动去除SQL语句中的用户名。 eg&#xff1a; select * from examdb.table1; 执行时会自…

【Java Web学习笔记】5 - XML

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/xml 零、在线文档 XML系列教程 一、XML引出 1.为什么需要XML 1.需求1 :两个程序间进行数据通信? 2.需求2:给一台服务器&#xff0c;做-一个配置文件&#xff0c;当服务器程序启动时&#xff0c;去…

vue3 setup语法糖 多条件搜索(带时间范围)

目录 前言&#xff1a; setup介绍&#xff1a; setup用法&#xff1a; 介绍&#xff1a; 前言&#xff1a; 不管哪个后台管理中都会用到对条件搜索带有时间范围的也不少见接下来就跟着我步入vue的多条件搜索&#xff08;带时间范围&#xff09; 在 Vue 3 中&#xff0c;你…

coding创建远程分支。并拉取远程新分支+推送代码

进入coding ----项目----代码仓库---点击 下拉之后查看全部----创建分支 创建分支之后执行下面命令 git branch -a // 查看所有分支 这个时候发现自己创建的分支没有显示这是因为自己在远程创建了分支但是本地还没有分支 执行 git fetch命令 用于从远程仓库获取最新的提交…

智能优化算法应用:基于混沌博弈算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于混沌博弈算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于混沌博弈算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.混沌博弈算法4.实验参数设定5.算法结果6.参考…

Linux【缓冲区】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb;缓冲区是什么&#xff1f;为…

VSCode + gdb + gdbserver调试ARM程序

在开发ARM嵌入式端C/C程序时&#xff0c;一般会在PC上编写代码&#xff0c;在Linux服务器上编译&#xff0c;然后将程序复制或挂载到ARM开发板上运行。如果程序出了问题&#xff0c;在不使用gdb的情况下&#xff0c;经常在代码中添加打印&#xff0c;编译&#xff0c;然后在开发…

SpringCloud 微服务集群升级记录(1.5.x-2.7.18)

前言 前段时间&#xff0c;因项目被扫出大量漏洞&#xff0c;全是因为依赖版本过低&#xff0c;存在高中危漏洞需要升级。正好本来也有规划集群升级&#xff0c;因为工作量大迟迟落实不了&#xff0c;正好有这次修漏洞的机会&#xff0c;升级微服务集群。这篇文章主要记录了本…

Java操作Excel之 POI介绍和入门

POI是Apache 提供的一个开源的Java API&#xff0c;用于操作Microsoft文档格式&#xff0c;如Excel、Word和PowerPoint等。POI是Java中处理Microsoft文档最受欢迎的库。 截至2023/12&#xff0c; 最新版本时 POI 5.2.5。 JDK版本兼容 POI版本JDK版本4.0及之上版本> 1.83.…

第四十篇v-if vs v-show

v-if vs v-show v-if 是“真正”的条件渲染&#xff0c;因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。v-if 也是惰性的&#xff1a;如果在初始渲染时条件为假&#xff0c;则什么也不做——直到条件第一次变为真时&#xff0c;才会开始渲染条件块。…

【2】PyQt创建窗口

1. 第一个PyQt窗口 from PyQt5.QtWidgets import QApplication,QWidget import sys# 1.创建应用程序 app QApplication(sys.argv)# 2.创建窗口 w QWidget()# 3.显示窗口 w.show()# 4.等待窗口停止 sys.exit(app.exec()) 执行代码,就会显示PyQt窗口: 2. PyQt模块简介 PyQt中…

Java参数验证@Validated

就以登录接口为例&#xff0c;如果用户传参的时候没有传递帐号或者密码&#xff0c;会报错&#xff0c;但是报错的信息不够全面&#xff0c;前端人员不好判断是什么问题&#xff0c;这个时候就需要对参数进行一个校验 引入依赖 <dependency><groupId>org.hibernat…

JAVAEE初阶相关内容第十八弹--网络原理之TCP_IP【续集】

写在前 上一篇博客的重点内容主要讲了关于传输层的TCP协议、UDP协议。 点击跳转上一篇博客 重点介绍了协议的特点、协议端格式、需要重点理解并掌握TCP的工作机制&#xff08;十条&#xff09;。 TCP与UDP对比&#xff1f; TCP用于可靠传输的情况&#xff0c;应用于文件传输&am…

客服系统优化:薪人薪事无代码开发与API连接简化电商平台集成

无代码开发的革新意义 在数字化时代&#xff0c;企业持续寻求提高效率与竞争力的解决方案。无代码开发技术应运而生&#xff0c;为电商平台与客服系统之间的集成提供了全新的可能。薪人薪事通过其先进的无代码开发能力和灵活的API连接&#xff0c;使得电商平台的集成过程变得前…

一. 初识数据结构和算法

数据结构与算法是一个达到高级程序员的敲门砖。当你脱离了语言的应用层面&#xff0c;去思考他的设计层面时&#xff0c;你就依旧已经开始初识数据结构与算法了 数据结构 什么是数据结构 对于数据结构的定义官方并没有统一的解释&#xff0c;在各个百科以及算法的书中&#xf…

类和对象——(7)this指针

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 人生就像骑单车&#xff0c;想保持平衡…

性能测试流程、指标及常见问题!

1.介绍性能测试流程 a.性能需求分析&#xff08;评审&#xff09; 基于接口或者场景&#xff08;全链路&#xff09;的性能测试指标&#xff0c;一般是tps&#xff08;每秒事务数&#xff0c;这里都是通过的事务&#xff09;及art&#xff08;平均响应时间&#xff09; b.了解…

Python @dataclass unhashable type

在使用类装饰器 dataclass 的时候&#xff0c;碰到无法hash 自定义hash函数&#xff1a; dataclass class Centroids:xids: np.ndarraydef __hash__(self):x self.xidsreturn hash(x.data.tobytes())def __eq__(self, other):return hash(self) hash(other)ref: https://s…

Lombok的踩坑系列之@Builder

背景&#xff1a; Lombok 这个插件大家日常工作中几乎是必备的&#xff0c;几个简单的注解就可以帮助我们减少一大坨get/set方法等&#xff1b;其中Builder注解使用的也很广泛&#xff0c;使用了建造者模式帮助我们构建出个性化的对象&#xff0c;本次踩坑点就在这个地方。 先…