【力扣 + 牛客 | SQL题 | 每日三题】大厂笔试真题W1,W4

1. 力扣603:连续空余的座位

1.1 题目:

表: Cinema

+-------------+------+
| Column Name | Type |
+-------------+------+
| seat_id     | int  |
| free        | bool |
+-------------+------+
Seat_id 是该表的自动递增主键列。
在 PostgreSQL 中,free 存储为整数。请使用 ::boolean 将其转换为布尔格式。
该表的每一行表示第 i 个座位是否空闲。1 表示空闲,0 表示被占用。

查找电影院所有连续可用的座位。

返回按 seat_id 升序排序 的结果表。

测试用例的生成使得两个以上的座位连续可用。

结果表格式如下所示。

示例 1:

输入: 
Cinema 表:
+---------+------+
| seat_id | free |
+---------+------+
| 1       | 1    |
| 2       | 0    |
| 3       | 1    |
| 4       | 1    |
| 5       | 1    |
+---------+------+
输出: 
+---------+
| seat_id |
+---------+
| 3       |
| 4       |
| 5       |
+---------+

1.2 思路:

想到用自连接的话就是一道简单题。

1.3 题解:

-- 子连接
-- 如果该座位id的free是1,并且它下一个座位的free也是1
-- 则将这两个座位id都记录下来。
with tep as (
    select t1.seat_id id1, t2.seat_id id2
    from Cinema t1
    join Cinema t2
    on t1.seat_id+1=t2.seat_id 
    and t1.free=1
    and t2.free
), tep2 as (
    -- 然后将相邻的座位id提取出来去重。
    select id1 seat_id
    from tep
    union
    select id2 seat_id
    from tep
)
select *
from tep2
order by seat_id

2. 牛客SQL大厂笔试真题:SQLW1:每个月Top3的周杰伦歌曲

2.1 题目:

描述

从听歌流水中找到18-25岁用户在2022年每个月播放次数top 3的周杰伦的歌曲

示例1

输入:

drop table if exists play_log;
create table `play_log` (
    `fdate` date,
    `user_id` int,
    `song_id` int
);
insert into play_log(fdate, user_id, song_id)
values 
('2022-01-08', 10000, 0),
('2022-01-16', 10000, 0),
('2022-01-20', 10000, 0),
('2022-01-25', 10000, 0),
('2022-01-02', 10000, 1),
('2022-01-12', 10000, 1),
('2022-01-13', 10000, 1),
('2022-01-14', 10000, 1),
('2022-01-10', 10000, 2),
('2022-01-11', 10000, 3),
('2022-01-16', 10000, 3),
('2022-01-11', 10000, 4),
('2022-01-27', 10000, 4),
('2022-02-05', 10000, 0),
('2022-02-19', 10000, 0),
('2022-02-07', 10000, 1),
('2022-02-27', 10000, 2),
('2022-02-25', 10000, 3),
('2022-02-03', 10000, 4),
('2022-02-16', 10000, 4);

drop table if exists song_info;
create table `song_info` (
    `song_id` int,
    `song_name` varchar(255),
    `singer_name` varchar(255)
);
insert into song_info(song_id, song_name, singer_name) 
values
(0, '明明就', '周杰伦'),
(1, '说好的幸福呢', '周杰伦'),
(2, '江南', '林俊杰'),
(3, '大笨钟', '周杰伦'),
(4, '黑键', '林俊杰');

drop table if exists user_info;
create table `user_info` (
    `user_id`   int,
    `age`       int
);
insert into user_info(user_id, age) 
values
(10000, 18)
复制输出:

month|ranking|song_name|play_pv
1|1|明明就|4
1|2|说好的幸福呢|4
1|3|大笨钟|2
2|1|明明就|2
2|2|说好的幸福呢|1
2|3|大笨钟|1

复制说明:

1月被18-25岁用户播放次数最高的三首歌为“明明就”、“说好的幸福呢”、“大笨钟”,“明明就”和“说好的幸福呢”播放次数相同,排名先后由两者的song_id先后顺序决定。2月同理。
备注:

MySQL中,日期转月份的函数为 month(),例:SELECT MONTH(‘2016-01-16') 返回 1。

2.2 思路:

在力扣也刷了一百多题sql了,想battle一下牛客的sql题,然后就一行以为很简单,但写着写着不对劲啊......运气好还是给我一次过了。

2.3 题解:

with tep1 as (
    -- 先找到是周杰伦的歌曲
    select song_id, song_name
    from song_info
    where singer_name = '周杰伦'
), tep2 as (
    -- 然后再找到18到25岁人的群体
    select user_id
    from user_info
    where age between 18 and 25
), tep3 as (
    -- 在play_log过滤不符合条件的记录
    select month(fdate) months, song_id
    from play_log t1
    where user_id in (select * from tep2)
    and song_id in (select song_id from tep1)
    and year(fdate) = 2022
), tep4 as (
    -- 以月份和歌曲id分组,然后计算个数
    select months, song_id, count(*) play_pv
    from tep3
    group by months, song_id
), tep5 as (
    -- 使用窗口函数进行排名
    select months, song_id, play_pv, rank() over (partition by months order by play_pv desc, song_id) ranks
    from tep4
), tep6 as (
    -- 过滤掉排名不是1, 2, 3的记录
    select months `month`, ranks ranking, play_pv, song_id
    from tep5
    where ranks in (1, 2, 3)
)
-- 最后order by查询即可
select `month`, ranking, song_name, play_pv
from tep6 t1
join tep1 t2
on t1.song_id = t2.song_id
order by `month`, ranking

3. 牛客SQL大厂笔试真题:SQLW4:获取指定客户每月的消费额

3.1 题目:

描述

某金融公司某项目下有如下 2 张表:

交易表 trade(t_id:交易流水号,t_time:交易时间,t_cus:交易客户,t_type:交易类型【1表示消费,0表示转账】,t_amount:交易金额):

客户表 customer(c_id:客户号,c_name:客户名称):

现需要查询 Tom 这个客户在 2023 年每月的消费金额(按月份正序显示),示例如下:

请编写 SQL 语句实现上述需求。

示例1

输入:

drop table if exists  `trade` ; 
CREATE TABLE `trade` (
`t_id` int(11) NOT NULL,
`t_time` TIMESTAMP NOT NULL,
`t_cus` int(16) NOT NULL,
`t_type` int(2) NOT NULL,
`t_amount` double NOT NULL,
PRIMARY KEY (`t_id`));
INSERT INTO trade VALUES(1,'2022-01-19 03:14:08',101,1,45);
INSERT INTO trade VALUES(2,'2023-02-15 11:22:11',101,1,23.6);
INSERT INTO trade VALUES(3,'2023-03-19 05:33:22',102,0,350);
INSERT INTO trade VALUES(4,'2023-03-21 06:44:09',103,1,16.9);
INSERT INTO trade VALUES(5,'2023-02-21 08:44:09',101,1,26.9);
INSERT INTO trade VALUES(6,'2023-07-07 07:11:45',101,1,1200);
INSERT INTO trade VALUES(7,'2023-07-19 06:04:32',102,1,132.5);
INSERT INTO trade VALUES(8,'2023-09-19 11:23:11',101,1,130.6);
INSERT INTO trade VALUES(9,'2023-10-19 04:32:30',103,1,110);

drop table if exists  `customer` ;   
CREATE TABLE `customer` (
`c_id` int(11) NOT NULL,
`c_name` varchar(20) NOT NULL,
PRIMARY KEY (`c_id`));
INSERT INTO customer VALUES(101,'Tom');
INSERT INTO customer VALUES(102,'Ross');
INSERT INTO customer VALUES(103,'Juile');
INSERT INTO customer VALUES(104,'Niki');
复制输出:

time|total
2023-02|50.5
2023-07|1200.0
2023-09|130.6

3.2 思路:

第一步:临时表过滤。第二步:把日期字段截取当做整体。

3.3 题解:

with tep as (
    -- where过滤不是tom的记录and不是消费的记录
    select t_time,
    if(t_type=1, t_amount, 0) t_amount
    from trade
    where t_cus = (
        select c_id
        from customer
        where c_name = 'Tom'
    )
    and year(t_time) = 2023

)
-- 然后截取日期的前七位。
select substring(t_time, 1, 7) time, round(sum(t_amount), 1) total
from tep
group by substring(t_time, 1, 7)
order by time

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

练习LabVIEW第十九题

学习目标: 刚学了LabVIEW,在网上找了些题,练习一下LabVIEW,有不对不好不足的地方欢迎指正! 第十九题: 创建一个程序把另外一个VI的前面板显示在Picture控件中 开始编写: 在前面板放置一个二…

C语言教程——数组(2)

目录 系列文章目录 前言 4、数组作为函数参数 4.1冒泡函数的错误设计 4.2数组名是什么? 总结 前言 我们知道一维数组是连续存放的,随着数组下标的增长,地址是由低到高依次存放的,二维数组,也是在内存里面是连续存放的…

Linux | 配置docker环境时yum一直出错的解决方法

yum出错 Centos 7版本出错问题补充:什么是yumyum 和 apt 有什么区别? Centos 7版本 [rootlocalhost yum.repos.d]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)出错问题 问题1 Could not retrieve mirrorlist http://mirrorlist.ce…

SQLite 3.47.0 发布,大量新功能来袭

SQLite 开发团队于 2024 年 10 月 21 日发布了 SQLite 3.47.0 版本,我们来了解一下新版本的改进功能。 触发器增强 SQLite 3.47.0 版本开始,触发器函数 RAISE() 的 error-message 参数可以支持任意 SQL 表达式。在此之前,该参数只能是字符串…

论1+2+3+4+... = -1/12 的不同算法

我们熟知自然数全加和, 推导过程如下, 这个解法并不难,非常容易看懂,但是并不容易真正理解。正负交错和无穷项计算,只需要保持方程的形态,就可以“预知”结果。但是这到底说的是什么意思?比如和…

Nodejs使用pkg打包为可执行文件

安装pkg npm install -g pkg查看pkg命令 pkg --help修改package.json 新增bin入口配置 {"name": "takescreenshot","version": "1.0.0","bin": "app.js", // 新增bin入口配置"scripts": {"t…

day10:ssh服务-跳板机

一,ssh服务概述 ssh服务概述 ssh(Secure Shell)是一种用于在不安全网络中进行安全登录、远程执行命令及传输文件的网络协议。它通过加密技术来保证通信的保密性和完整性,主要用于替代不安全的telnet、rlogin、rsh等协议。ssh通常…

计算机视觉-边缘检测实验报告

实验一 边缘检测实验 一、实验目的 1.理解并掌握 Sobel 算子和 Canny 算子的基本原理和应用。 2.学习如何在图像处理中使用这两种算子进行边缘检测。 3.比较 Sobel 算子和 Canny 算子的性能,了解各自的优缺点。 4&#xff0…

【mysql进阶】4-3. 页结构

页面结构 ⻚在MySQL运⾏的过程中起到了⾮常重要的作⽤,为了能发挥更好的性能,可以结合⾃⼰系统的业务场景和数据⼤⼩,对⻚相关的系统变量进⾏调整,⻚的⼤⼩就是⼀个⾮常重要的调整项。同时关于⻚的结构也要有所了解,以…

HTTP协议讲解

前瞻: 认识URL 1.ipport 2.平时上网,就是进程间通信 3.上网行为,1.获取资源 2.上传数据 相当于I/O 4.http协议采用tcp协议 网页 图片 音乐其实都是资源 Http请求 http request Method:Get/Post资源/路径&#xff1a…

MyBatis缓存详解(一级缓存、二级缓存、缓存查询顺序)

固态硬盘缺陷:无法长时间使用,而磁盘只要不消磁,只要不受到磁影响,就可以长期使用,因此绝大多数企业还是使用磁盘来存储数据 像mysql这种关系型数据库中的数据存储在磁盘中,为方便查询,减少系统…

Linux文件类型和根目录结构

Linux文件类型和根目录结构 1.文件类型 字符文件类型说明~普通文件类似于Windows的记事本d目录文件类似于windows文件夹c字符设备文件串行端口设备,顺序读写,键盘b块设备文件可供存储的接口设备,随机读写,硬盘p管道文件用于进程…

工程项目管理软件怎么选?推荐7款实用工具

本文提及的有主流7款工程项目管理系统软件有: 1. Worktile;2. 广联达BIM5D;3. 泛普软件;4. 明源云工程;5. 飞书;6. Smartsheet;7. Procore。 很多工程项目管理人员常常头疼如何有效地管理多个项目&#xff…

保研考研机试攻略:python笔记(1)

🐨🐨🐨宝子们好呀 ~ 我来更新欠大家的python笔记了,从这一篇开始我们来学下python,当然,如果只是想应对机试并且应试语言以C和C为主,那么大家对python了解一点就好,重点可以看高分篇…

【机器学习】——numpy教程

文章目录 1.numpy简介2.初始化numpy3.ndarry的使用3.1numpy的属性3.2numpy的形状3.3ndarray的类型 4numpy生成数组的方法4.1生成0和1数组4.2从现有的数组生成4.3生成固定范围的数组4.4生成随机数组 5.数组的索引、切片6.数组的形状修改7.数组的类型修改8.数组的去重9.ndarray的…

接口测试(七)jmeter——参数化(RandomString函数)

一、RandomString函数 需求:模拟10个用户注册 1. 【工具】–>【函数助手对话框】 2. 选择RandomString函数 假设手机号码前3位设置为固定数值136,后8位可用RandomString函数随机产生数值 ① Random string length:8(随机长度…

记录element-ui改造select显示为table,并支持多查询条件

最近遇到的一个需求 , 很有趣,是需要一个select组件,要求显示工号,员工姓名,以及区域 三个字段,并且要支持三个字段的查询。显然element原生的组件不适用,这时候我们需要改造一下,把…

基于大数据 Python Vue 美食推荐可视化系统(源码+LW+部署讲解+数据库)

!!!!!!!!! 会持续一直更新下去 有问必答 一键收藏关注不迷路 源码获取:https://pan.baidu.com/s/1aRpOv3f2sdtVYOogQjb8jg?pwdjf1d 提取码: jf1d &#…

Java后端面试题:Java基础篇

目录 Java基础 1.请你说说Java中基本数据类型的bit长度? 2.switch支持哪些数据类型?支持long么? 3.讲一下常见编码方式? 4.char能不能存储中文? 5.为什么数组索引从0开始呢?假如从1开始不行吗&#xf…