大厂面试sql手撕题目总结

news2024/11/16 11:28:08

文章目录

  • 1. 常用函数
    • 1. 日期函数
  • 2. 行转列(转置)
    • 1. 行转列
  • 连续N天登录
    • 1. 查询出连续三天登录的人员姓名
  • N日留存率
    • 1. 求用户当天,次日,七日留存率
  • 分组内topN
    • 1. 求出每个部门工资最高的前三名员工,并计算这些员工的工资占所属部门总工资的百分比
  • 注意事项

1. 常用函数

1. 日期函数

常用日期函数:

-- 返回当前日期
select curdate();  # 2024-05-06
-- 返回当前时间
select curtime();  # 21:41:58
-- 返回当前日期加时间
select now();  # 2024-05-06 21:40:53
-- 获取指定date的年份
select year('2024-05-06 21:40:53'); # 2024
-- 获取指定date的月份
select month('2024-05-06 21:40:53'); # 5
-- 获取指定date的年份
select day('2024-05-06 21:40:53'); # 6
-- 返回一个日期/时间值加上一个时间间隔expr后的时间值
select date_add('2024-05-06',interval 1 year ); # 2025-05-06
select date_add('2024-05-06',interval 1 month ); # 2024-06-06
select date_add('2024-05-06',interval 1 day ); # 2024-05-07

-- timestampdiff(单位 ,date1,date2)    返回俩个日期之间的差值
# 单位有:
# 1、YEAR 年
# 2、QUARTER 季度
# 3、MONTH 月
# 4、WEEk 星期
# 5、DAY 天
# 6、HOUR 小时
# 7、MINUTE 分钟
# 8、SECOND 秒
# 9、FRAC_SECOND 毫秒
select timestampdiff(day ,'2024-05-06','2024-06-06'); # 31

-- DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据。
select DATE_FORMAT(NOW(),'%Y-%m-%d');  # 2024-05-06
select DATE_FORMAT(NOW(),'%d %b %Y %T'); # 06 May 2024 22:02:33
-- 返回一个日期/时间值加上一个时间间隔expr后的时间值
select date_sub('2024-05-06',interval 1 day );  # 2024-05-05

2. 行转列(转置)

行转列的常规做法是,group by+sum(if())【或count(if())】

1. 行转列

问题描述:
在这里插入图片描述
代码实现:

-- 行转列
-- 建表
create table table2(year int,month int ,amount double) CHARACTER SET utf8 COLLATE utf8_bin;
 insert into table2 values
 		   (1991,1,1.1),
    	   (1991,2,1.2),
           (1991,3,1.3),
           (1991,4,1.4),
           (1992,1,2.1),
           (1992,2,2.2),
           (1992,3,2.3),
           (1992,4,2.4);
-- 实现
select year,
       sum(if(month = 1,amount,0)) as m1,
       sum(if(month = 2,amount,0)) as m2,
       sum(if(month = 3,amount,0)) as m3,
       sum(if(month = 4,amount,0)) as m4
from table2
group by year;

连续N天登录

1. 查询出连续三天登录的人员姓名

在这里插入图片描述
sql实现:

# 建表:
CREATE TABLE game (
    name VARCHAR(10) ,
    login_date date
) CHARACTER SET utf8 COLLATE utf8_bin;
insert into game values
 ('张三','2021-01-01'),
 ('张三','2021-01-02'),
 ('张三','2021-01-03'),
 ('张三','2021-01-02'),
 ('李四','2021-01-01'),
('李四','2021-01-02'),
 ('王五','2021-01-03'),
 ('王五','2021-01-02'),
 ('王五','2021-01-02');

-- sql计算
with t1 as (
    select
        distinct *
    from game
),# 先对数据进行去重
t2 as (
    select *,
    row_number() over (partition by name order by login_date) as tmp
    from t1
),# 采用窗口函数增加一列,对name组内,按日期由大到小进行顺序标号
t3 as (select
    *,
    date_sub(login_date,interval tmp day ) as tmp_date
from t2)
select
   distinct name
from t3
group by name,tmp_date
having count(1) >= 3;

N日留存率

分析:

1. 求用户当天,次日,七日留存率

在这里插入图片描述
sql实现:

# 建表
create table if not exists tb_cuid_1d
(
    cuid         int comment '用户的唯一标识',
    os           varchar(10) comment '平台',
    soft_version int comment '版本',
    event_day    date comment '日期'
) CHARACTER SET utf8 COLLATE utf8_bin;

insert into tb_cuid_1d values
 (1,'android',1,'2020-04-01'),
 (1,'android',1,'2020-04-02'),
 (1,'android',1,'2020-04-08'),
 (2,'android',1,'2020-04-01'),
 (3,'android',1,'2020-04-02');

-- sql计算
with t1 as (
    select
        *
    from tb_cuid_1d
    where event_day in ('2020-04-01','2020-04-02','2020-04-08')
),
    t2 as ( # 计算用户的留存情况,非零表示用户当日的访问次数,null表示用户当日没有访问
        select
            cuid,
            count(if(event_day='2020-04-01',1,null)) as cnt1,
            count(if(event_day='2020-04-02',1,null)) as cnt2,
            count(if(event_day='2020-04-08',1,null)) as cnt8
        from t1
        group by cuid
        having cnt1 > 0
    ),
    t3 as ( # 计算留存用户数
        select
            count(cuid) as uv1,
            count(if(cnt2 > 0,1,null)) as uv2,
            count(if(cnt8 > 0,1,null)) as uv7
        from t2
    )
select
    uv2 / uv1,  # 留存率计算
    uv7 / uv1
from t3; 

分组内topN

需求常见词:【每组xxx的第一个yyy的zzz】【每组xxx的最后一个】

【每组xxx的前n个】【每组最xx的前n个】

公式:row_number() over(partition by 组名) as rn,再筛选rn<=N名

1. 求出每个部门工资最高的前三名员工,并计算这些员工的工资占所属部门总工资的百分比

在这里插入图片描述
在这里插入图片描述
sql代码:

with t1 as (
    select
        *,
        row_number() over (partition by deptno order by sal desc ) as '部门薪资排名',
        sum(sal) over(partition by deptno) as '部门总工资'
    from emp
)
select
    empno as '员工工号',
    sal as '员工工资',
    deptno as '部门编号',
    部门薪资排名,
    部门总工资,
    round(sal/部门总工资,2)
from t1
where 部门薪资排名 <= 3;

注意事项

1、group by 语句的使用

在使用group by的语句中,select 后面只能跟group by字段和聚合函数。

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

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

相关文章

AWS Cli Windows安装配置

1. 安装 下载地址&#xff1a;AWS 命令行界面(CLI)_管理AWS服务的统一工具-AWS云服务 检验安装&#xff1a; > aws --version aws-cli/2.15.44 Python/3.11.8 Windows/10 exe/AMD64 prompt/off 2. 创建IAM用户 1) 创建组 选择IAM 点击创建组 填写用户组名&#xff0c;…

YOLOv5改进 | 独家创新篇 | 利用MobileNetV4的UIB模块二次创新C3(全网独家首发)

一、本文介绍 本文给大家带来的改进机制是利用MobileNetV4的UIB模块二次创新C3&#xff0c;其中UIB模块来自2024.5月发布的MobileNetV4网络&#xff0c;其是一种高度优化的神经网络架构&#xff0c;专为移动设备设计。它最新的改动总结主要有两点&#xff0c;采用了通用反向瓶…

synchronized关键字和ReentrantLock锁区别

synchronized关键字和ReentrantLock锁是Java中用于同步的两个重要机制&#xff0c;它们在很多方面有所不同&#xff1a; 1. **锁定范围**: synchronized关键字只能在方法的执行过程中提供锁定&#xff0c;而ReentrantLock可以锁定任何对象&#xff0c;包括方法、代码块和对象。…

django项目结构介绍

小白的django学习笔记 五一前的某天 文章目录 django项目结构介绍项目的基本配置templates项目模块manage.pyExternal Libraries django项目结构介绍 项目的基本配置 在这里配置&#xff0c;跟工程名是一样的 templates 放网页、js、css的地方 django 项目模块 项目开发时&…

Android Studio高版本安卓模拟器抓取https包

Android Studio avd 设置 证书生成 *.cer格式证书​ openssl x509 -inform DER -subject\_hash\_old -in charles-ssl-proxying-certificate.cer​ *.pem格式证书​ openssl x509 -inform PEM -subject\_hash\_old -in charles-ssl-proxying-certificate.pem会输出 2cb30a9e …

QX------mini51单片机学习------(5)数码管的静态与动态显示

目录 1数码管应用场景 2数码管显示原理 3静态与动态显示 474HC573锁存器工作原理 5上拉电阻的作用 6原理图分析 7实践 1数码管应用场景 2数码管显示原理 图&#xff08;b&#xff09;左边是共阴极&#xff0c;右边是共阳极 GND是公共极&#xff0c;可以用万用表测&am…

【JavaEE初阶系列】——理解Cookie 和 Session以及相关API

目录 &#x1f6a9;Cookie &#x1f6a9;Session &#x1f6a9;Servlet API &#x1f388;HttpServletRequest &#x1f388;HttpSession &#x1f6a9;Cookie http请求header中一个属性&#xff0c;浏览器持久化存储数据的一种机制&#xff0c;网页无法访问主机的文件系…

技术速递|Python in Visual Studio Code 2024年4月发布

排版&#xff1a;Alan Wang 我们很高兴地宣布 Visual Studio Code 的 Python 和 Jupyter 扩展 2024 年 4 月发布&#xff01; 此版本包括以下公告&#xff1a; 改进了 Flask 和 Django 的调试配置流程Jupyter Run Dependent Cells with Pylance 的模块和导入分析Hatch 环境发…

【Leetcode每日一题】 综合练习 - 逆波兰表达式求值(难度⭐⭐)(73)

1. 题目解析 题目链接&#xff1a;150. 逆波兰表达式求值 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 数据结构选择&#xff1a; 使用栈&#xff08;stack<int>&#xff09;来存储操作数&#xff0c;以便进…

OpenHarmony 3.2 Release版本实战开发——Codec HDI适配过程

简介 OpenHarmony Codec HDI&#xff08;Hardware Device Interface&#xff09;驱动框架基于 OpenMax 实现了视屏硬件编解码驱动&#xff0c;提供 Codec 基础能力接口供上层媒体服务调用&#xff0c;包括获取组件编解码能力、创建组件、参数设置、数据的轮转和控制、以及销毁…

OpenMVS学习笔记(一):WSL编译安装测试

1.CUDA和CUDNN安装 [1] WSL版本cuda安装&#xff1a; >> wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin >> sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600 >> wg…

Burp Suite (bp)启动激活报错问题

一、自查 1、从哪里下载程序 【大部分同学的问题&#xff0c;都是重新下载解决的&#xff0c;简单快速直接】 一律使用“常用软件”中提供的Burp Suite软件包&#xff0c;方便排查问题 自带JDK的版本 Burp 2024.3&#xff0c;自带JDK21&#xff0c;双击bat即可启动&#xff…

YOLOv8网络结构介绍

将按照YOLOv8目标检测任务、实例分割任务、关键点检测任务以及旋转目标检测任务的顺序来介绍&#xff0c;主要内容也是在目标检测任务中介绍&#xff0c;其他任务也只是Head层不相同。 1.YOLOv8_det网络结构 首先&#xff0c;YOLOv8网络分成了三部分&#xff0c;分别是主干网络…

Java | Spring框架| 集合与复杂类型的注入:处理多值依赖

集合与复杂类型的注入&#xff1a;处理多值依赖 在Spring框架中&#xff0c;除了可以注入简单的依赖类型&#xff0c;如字符串、整数等&#xff0c;还可以注入集合类型和复杂类型的数据。集合类型包括List、Set、Map和数组&#xff0c;而复杂类型可以是自定义的对象、配置类等…

【JavaEE网络】用Form与Ajax构建HTTP请求

目录 通过 form 表单构造 HTTP 请求form 发送 GET 请求form 发送 POST 请求 通过 ajax 构造 HTTP 请求发送 GET 请求发送 POST 请求发送 application/json 数据封装 ajax 方法 通过 form 表单构造 HTTP 请求 form (表单) 是 HTML 中的一个常用标签. 可以用于给服务器发送 GET …

janus源码分析

基础说明 janus官网 https://janus.conf.meetecho.com/index.html janus源码地址 https://github.com/meetecho/janus-gateway 编译及部署参考 https://pro-hnb.blog.csdn.net/article/details/137730389?spm1001.2014.3001.5502 https://pro-hnb.blog.csdn.net/article/deta…

QT设计模式:策略模式

基本概念 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一系列方法&#xff0c;并使它们可以相互替换。策略模式使得算法可以独立于客户端而变化&#xff0c;使得客户端可以根据需要选择相应的算法。 策略模式通常由以下角色组…

AutoDL服务器远程桌面

文章目录 1.安装VNC和必要的一些图形显式库:2.SSH隧道2.1.本地安装openssh服务器2.2.服务开启2.3.显示当前安装的 SSH 版本信息2.3.设置一个 SSH 隧道 注意3.VNC Viewer客户端登录4.测试5.参考 VNC&#xff08;Virtual Network Computing &#xff09;是一种图形化的桌面共享协…

mac电脑如何安装java

1、检查当前系统的 Java 版本 打开终端,输入以下命令查看当前 Java 版本 /usr/bin/java -version 2、前往 Java 官网下载 Java JDK 打开 Java 官网 (https://www.java.com/zh-CN/download/) 并下载最新版本的 Java JDK。 3、安装 Java JDK 双击下载的 .dmg 文件启动安装程序…

力扣爆刷第135天之数组五连刷(双指针快慢指针滑动窗口)

力扣爆刷第135天之数组五连刷&#xff08;双指针快慢指针滑动窗口&#xff09; 文章目录 力扣爆刷第135天之数组五连刷&#xff08;双指针快慢指针滑动窗口&#xff09;一、704. 二分查找二、27. 移除元素三、977. 有序数组的平方四、209. 长度最小的子数组五、59. 螺旋矩阵 II…