常用难sql总结一
创始人
2025-05-31 15:00:00
0

常见sql总结一

知识点描述题号
datediff对日期类型做比较1
3+表联表查询层级递进慢慢写2
replace函数replace(字段名,value1,value2)3
rank() over (order by xxx desc)rank并列并舍弃4
row_number()继续排序4
dense_rank()并列不舍弃4
partition by xxx多次重新排序5
limit m,n其中m是指记录开始的index,从0开始,表示第一条记录;n是指从m+1条开始,取n条。6

1、牛客每个人最近的登录日期(五)

描述

牛客每天有很多人登录,请你统计一下牛客每个日期新用户的次日留存率。
有一个登录(login)记录表,简况如下:

iduser_idclient_iddate
1212020-10-12
2322020-10-12
3122020-10-12
4222020-10-13
5122020-10-13
6312020-10-14
7412020-10-14
8412020-10-15

请你写出一个sql语句查询每个日期新用户的次日留存率,结果保留小数点后面3位数(3位之后的四舍五入),并且查询结果按照日期升序排序,上面的例子查询结果如下:

datep
2020-10-120.667
2020-10-130.000
2020-10-141.000
2020-10-150.000

查询结果表明:
2020-10-12登录了3个(user_id为2,3,1)新用户,2020-10-13,只有2个(id为2,1)登录,故2020-10-12新用户次日留存率为2/3=0.667;
2020-10-13没有新用户登录,输出0.000;
2020-10-14登录了1个(user_id为4)新用户,2020-10-15,user_id为4的用户登录,故2020-10-14新用户次日留存率为1/1=1.000;

2020-10-15没有新用户登录,输出0.000;

(注意:sqlite里查找某一天的后一天的用法是:date(yyyy-mm-dd, ‘+1 day’),sqlite里1/2得到的不是0.5,得到的是0,只有1*1.0/2才会得到0.5)

SELECT date,IFNULL(ROUND(SUM(CASE WHEN (user_id,date) IN
(SELECT user_id,DATE_ADD(date,INTERVAL -1 DAY) FROM login)
AND (user_id,date) IN (SELECT user_id,MIN(date) FROM login GROUP BY user_id)
THEN 1 ELSE 0 END)/
SUM(CASE WHEN (user_id,date) IN (SELECT user_id,MIN(date) FROM login GROUP BY user_id)
THEN 1 ELSE 0 END),3),0) AS p
FROM login
GROUP BY date
ORDER BY date;

2、获取员工其当前的薪水比其manager当前薪水还高的相关信息

描述

有一个,部门关系表dept_emp简况如下:

emp_nodept_nofrom_dateto_date
10001d0011986-06-269999-01-01
10002d0011996-08-039999-01-01

有一个部门经理表dept_manager简况如下:

dept_noemp_nofrom_dateto_date
d001100021996-08-039999-01-01

有一个薪水表salaries简况如下:

emp_nosalaryfrom_dateto_date
10001889582002-06-229999-01-01
10002725271996-08-039999-01-01

获取员工其当前的薪水比其manager当前薪水还高的相关信息,

第一列给出员工的emp_no,
第二列给出其manager的manager_no,
第三列给出该员工当前的薪水emp_salary,
第四列给该员工对应的manager当前的薪水manager_salary

以上例子输出如下:

emp_nomanager_noemp_salarymanager_salary
10001100028895872527
selecta.emp_no,b.emp_no as manager_no,c.salary as emp_salary,d.salary as manager_dalary
fromdept_emp aleft join dept_manager b on a.dept_no = b.dept_noleft join salaries c on a.emp_no = c.emp_noleft join salaries d on b.emp_no = d.emp_no
havingc.salary > d.salary

3、将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005,其他数据保持不变,使用replace实现要求

UPDATEtitles_test
setemp_no = REPLACE (emp_no, "10001", "10005");

4、获取当前薪水第二多的员工的emp_no以及其对应的薪水sal

链接:https://www.nowcoder.com/questionTerminal/8d2c290cc4e24403b98ca82ce45d04db
来源:牛客网

有一个薪水表salaries简况如下:

emp_nosalaryfrom_dateto_date
10001889582002-06-229999-01-01
10002725272001-08-029999-01-01
10003433112001-12-019999-01-01

请你获取薪水第二多的员工的emp_no以及其对应的薪水salary,

若有多个员工的薪水为第二多的薪水,则将对应的员工的emp_no和salary全部输出,并按emp_no升序排序。

emp_nosalary
1000272527
selectemp_no,salary
from(selectemp_no,salary,rank() over (order bysalary desc) as t_rankfromsalaries) as T
whereT.t_rank = 2

5、获取每个部门中当前员工薪水最高的相关信息

描述

有一个员工表dept_emp简况如下:

emp_nodept_nofrom_dateto_date
10001d0011986-06-269999-01-01
10002d0011996-08-039999-01-01
10003d0021996-08-039999-01-01

有一个薪水表salaries简况如下:

emp_nosalaryfrom_dateto_date
10001889582002-06-229999-01-01
10002725272001-08-029999-01-01
10003925272001-08-029999-01-01

获取每个部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary,按照部门编号dept_no升序排列,以上例子输出如下:

dept_noemp_nomaxSalary
d0011000188958
d0021000392527
selectdept_no,emp_no,salary as maxSalary
from(selecta.dept_no,a.emp_no,b.salary,row_number() over (partition bya.dept_noorder bysalary desc) as tmp_nofromdept_emp aleft join salaries b on a.emp_no = b.emp_no) as T
whereT.tmp_no = 1

6、查找入职员工时间排名倒数第三的员工所有信息

要求可能有并列的存在

select*
fromemployees
wherehire_date = (selecthire_datefromemployeesgroup byhire_dateorder byhire_date desclimit2, 1)

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
JAVA多线程知识整理 Java多线程基础 线程的创建和启动 继承Thread类来创建并启动 自定义Thread类的子类&#...
【洛谷 P1090】[NOIP... [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G ...
国民技术LPUART介绍 低功耗通用异步接收器(LPUART) 简介 低功耗通用异步收发器...
城乡供水一体化平台-助力乡村振... 城乡供水一体化管理系统建设方案 城乡供水一体化管理系统是运用云计算、大数据等信息化手段࿰...
程序的循环结构和random库...   第三个参数就是步长     引入文件时记得指明字符格式,否则读入不了 ...
中国版ChatGPT在哪些方面... 目录 一、中国巨大的市场需求 二、中国企业加速创新 三、中国的人工智能发展 四、企业愿景的推进 五、...
报名开启 | 共赴一场 Flu... 2023 年 1 月 25 日,Flutter Forward 大会在肯尼亚首都内罗毕...
汇编00-MASM 和 Vis... Qt源码解析 索引 汇编逆向--- MASM 和 Visual Studio入门 前提知识ÿ...
【简陋Web应用3】实现人脸比... 文章目录🍉 前情提要🌷 效果演示🥝 实现过程1. u...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
windows安装JDK步骤 一、 下载JDK安装包 下载地址:https://www.oracle.com/jav...
分治法实现合并排序(归并排序)... 🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨...
在linux上安装配置node... 目录前言1,关于nodejs2,配置环境变量3,总结 前言...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
Linux内核进程管理并发同步... 并发同步并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理...
opencv学习-HOG LO... 目录1. HOG(Histogram of Oriented Gradients,方向梯度直方图)1...
EEG微状态的功能意义 导读大脑的瞬时全局功能状态反映在其电场结构上。聚类分析方法一致地提取了四种头表面脑电场结构ÿ...
【Unity 手写PBR】Bu... 写在前面 前期积累: GAMES101作业7提高-实现微表面模型你需要了解的知识 【技...