SQL技巧笔记(一):连续3人的连号问题—— LeetCode601.体育馆的人流量

news2024/11/19 19:22:59

SQL 技巧笔记

前言:我发现大数据招聘岗位上的应聘流程都是需要先进行笔试,其中占比很大的部分是SQL题目,经过一段时间的学习之后,今天开了一个力扣年会员,我觉得我很有必要去多练习笔试题目,这些题目是有技巧性的,很贴近生活!

Tips:我很享受独自做出题目的感觉,也很喜欢和大家分享自己的思路!我会继续努力,遇到有趣的题目,独特的思路会和大家多多交流!

文章目录

  • SQL 技巧笔记
    • 一、连续 3 人的连号问题
      • 1. 题目来源
      • 2. 题目描述
      • 3. 题目理解
      • 4. 思路顺序
        • (1) 筛选每行的人数大于或等于 `100`
        • (2) 找出 id,前一个 id,后一个 id
        • (3) 找出三个id之间的关系
        • (4) 找出五个id之间的关系
      • 5. 提交答案

一、连续 3 人的连号问题

1. 题目来源

  • LeetCode 601.体育馆的人流量
  • 困难型题目
  • 网易公司的笔试题

2. 题目描述

表:Stadium

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| visit_date    | date    |
| people        | int     |
+---------------+---------+
visit_date 是该表中具有唯一值的列。
每日人流量信息被记录在这三列信息中:序号 (id)、日期 (visit_date)、 人流量 (people)
每天只有一行记录,日期随着 id 的增加而增加

编写解决方案找出每行的人数大于或等于 100id 连续的三行或更多行记录。

返回按 visit_date 升序排列 的结果表。

查询结果格式如下所示。

示例 1:

输入:
Stadium 表:
+------+------------+-----------+
| id   | visit_date | people    |
+------+------------+-----------+
| 1    | 2017-01-01 | 10        |
| 2    | 2017-01-02 | 109       |
| 3    | 2017-01-03 | 150       |
| 4    | 2017-01-04 | 99        |
| 5    | 2017-01-05 | 145       |
| 6    | 2017-01-06 | 1455      |
| 7    | 2017-01-07 | 199       |
| 8    | 2017-01-09 | 188       |
+------+------------+-----------+
输出:
+------+------------+-----------+
| id   | visit_date | people    |
+------+------------+-----------+
| 5    | 2017-01-05 | 145       |
| 6    | 2017-01-06 | 1455      |
| 7    | 2017-01-07 | 199       |
| 8    | 2017-01-09 | 188       |
+------+------------+-----------+
解释:
id 为 5、6、7、8 的四行 id 连续,并且每行都有 >= 100 的人数记录。
请注意,即使第 7 行和第 8 行的 visit_date 不是连续的,输出也应当包含第 8 行,因为我们只需要考虑 id 连续的记录。
不输出 id 为 2 和 3 的行,因为至少需要三条 id 连续的记录。

数据源:

Create table If Not Exists Stadium (id int, visit_date DATE NULL, people int);
Truncate table Stadium;
insert into Stadium (id, visit_date, people) values ('1', '2017-01-01', '10');
insert into Stadium (id, visit_date, people) values ('2', '2017-01-02', '109');
insert into Stadium (id, visit_date, people) values ('3', '2017-01-03', '150');
insert into Stadium (id, visit_date, people) values ('4', '2017-01-04', '99');
insert into Stadium (id, visit_date, people) values ('5', '2017-01-05', '145');
insert into Stadium (id, visit_date, people) values ('6', '2017-01-06', '1455');
insert into Stadium (id, visit_date, people) values ('7', '2017-01-07', '199');
insert into Stadium (id, visit_date, people) values ('8', '2017-01-09', '188');

3. 题目理解

  • 需求一:编写解决方案找出每行的人数大于或等于 100

  • 需求二:且 id 连续的三行或更多行记录。

  • 需求三:返回按 visit_date 升序排列 的结果表。


4. 思路顺序

(1) 筛选每行的人数大于或等于 100

代码:

SELECT
    *
FROM Stadium WHERE people >=100

效果:发现 id 为 5, 6, 7, 8 满足至少连 3 号

在这里插入图片描述


(2) 找出 id,前一个 id,后一个 id

代码:

SELECT
           id,
           LAG(id,1) OVER(ORDER BY id) as pre_id, # 前一个id
           LEAD(id,1) OVER(ORDER BY id) as next_id, # 后一个id
           visit_date,
           people
           FROM Stadium WHERE people >=100

效果:发现最前面的id 的前一个id为null,最后一个id的后一个id为null

在这里插入图片描述


(3) 找出三个id之间的关系

代码:

with t1 as(
    SELECT
           id,
           LAG(id,1) OVER(ORDER BY id) as pre_id, # 前一个id
           LEAD(id,1) OVER(ORDER BY id) as next_id, # 后一个id
           visit_date,
           people
           FROM Stadium WHERE people >=100
)
select id,visit_date,people from t1
where
(id = pre_id + 1 and id = next_id - 1) OR # 当前 id 是连续序列的中间部分
(next_id = id + 1 and pre_id is null ) OR # 当前 id 是连续序列的最开始部分
(pre_id = id - 1 and next_id is null)    # 当前 id 是连续序列的最结束部分
order by id;

效果:发现原本需要的 5 居然不见了,明显找三者关系条件远远不够

在这里插入图片描述


(4) 找出五个id之间的关系

代码:

with t1 as(
    SELECT
           id,
           LAG(id,1) OVER(ORDER BY id) as pre_id, # 前一个id
           LAG(id,2) OVER (ORDER BY id) as pre_2_id, # 前两个id
           LEAD(id,1) OVER(ORDER BY id) as next_id, # 后一个id
           LEAD(id,2) OVER(ORDER BY id) as next_2_id, # 后两个id
           visit_date,
           people
           FROM Stadium WHERE people >=100
)
select id,visit_date,people from t1
where
(id = pre_id + 1 and id = next_id - 1) OR # 当前 id 是连续序列的中间部分
(pre_id is null and next_id = id + 1 and next_2_id = id + 2 ) OR # 当前 id 是连续序列的最开始部分
(next_id = id + 1 and next_2_id = id + 2 ) OR # 当前 id 是连续序列的最开始部分
(id = pre_id + 1 and next_id is NULL and pre_2_id = id - 2) OR  # 当前 id 是连续序列的最结束部分
(pre_id = id - 1 and pre_2_id = id - 2)    # 当前 id 是连续序列的最结束部分
order by id;

效果:答案正确,3 个id的联系需要考虑极端情况,所以一共需要 5个 条件!


5. 提交答案

效果展示:经过20分钟思考,解题结果提交通过!

对比官方:官方的答案很简略,不过我觉得自己想出来的思路很有趣哦!

# 官方答案

select distinct t1.*
from stadium t1, stadium t2, stadium t3
where t1.people >= 100 and t2.people >= 100 and t3.people >= 100
and
(
	(t1.id - t2.id = 1 and t1.id - t3.id = 2 and t2.id - t3.id =1)  -- t1, t2, t3
    or
    (t2.id - t1.id = 1 and t2.id - t3.id = 2 and t1.id - t3.id =1) -- t2, t1, t3
    or
    (t3.id - t2.id = 1 and t2.id - t1.id =1 and t3.id - t1.id = 2) -- t3, t2, t1
)
order by t1.id;

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

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

相关文章

C语言面试笔试||rtthread面试笔试全家桶

目录 1.rtthread内核框架与线程调度介绍 2.rtthread内核功能启动流程及汇编阶段 3.rtthread内存分布 4.内核对象管理系统 5.内核配置和剪裁 6.线程5种状态 7.进程与线程 8.CPU的内部结构 9.中断的优缺点 10.GPIO的输入输出模式 11.tcp为什么需要3次握手?…

基于粒子群优化算法的图象聚类识别matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于粒子群优化算法的图象聚类识别。通过PSO优化方法,将数字图片的特征进行聚类,从而识别出数字0~9. 2.测试软件版本以及运行结果展示 M…

It is also possible that a host key has just been changed

问题:ssh失败,提示如上图 分析: ssh的key存在上图里的路径里。 解决:win10删这个文件C:\Users\admin\.ssh\known_hosts , linux删这个文件.ssh\known_hosts ,或者删除这个文件里的制定ip的那一行,例如“106.1.1.22 ecdsa-sha2-…

SpringCloud-用nacos做服务注册与调用

步骤1:下载和安装Nacos 首先,你需要从Nacos的官方网站上下载并安装Nacos Server。根据你的操作系统选择合适的版本,并按照官方文档中的说明进行安装和配置。 步骤2:创建Spring Boot项目 在你喜欢的IDE中创建一个新的Spring Boot项…

VIMA:多模态提示的通用机器人操纵

机器人任务的表述有三种形式,分别是模仿one-shot演示、跟随语言指令、以及实现视觉目标。然而,这三种方式处理的任务不同,且模型也不同。基于提示的学习在自然语言处理领域展现了通用能力,单个模型可以处理各种各样的任务。VIMA是…

2024高频前端面试题 Vue2 和 Vue3 篇

* Vue2 和 Vue3的区别: 1)双向数据绑定原理的区别 2)根节点的不同 Vue2只能一个根节点 Vue3在组件中可以放置多个根节点 3)Vue3中采用composition API vue2:采用的选项型API(opsition API) vue3:采用的组合型API(composition A…

2024第二次培训:win11系统下使用nginx、JDK、mysql搭建基于vue2、java前后端分离的web应用运行环境

一.背景 公司安排了带徒弟的任务,给培训写点材料。前面分开介绍了mysql、jdk、nginx的安装,都只是零星的介绍,只能算零散的学习。学习了有什么用呢?能解决什么问题?能完成什么工作? 今天我们要用之前的几篇…

蓝桥杯(3.5)

789. 数的范围 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int q sc.nextInt();int[] res new int[n];for(int i0;i<n;i)res[i] sc.nextInt();while(q-- ! 0) {int…

鱼哥赠书活动第⑩期:一本书讲透ChatGPT,实现从理论到实践的跨越!大模型技术工程师必读

鱼哥赠书活动第⑩期&#xff1a; 内容简介&#xff1a;作者简介&#xff1a;读者对象&#xff1a;直播预告&#xff1a;购书链接&#xff1a;赠书抽奖规则:往期赠书福利&#xff1a; OpenAI 在 2022 年 11 月推出了人工智能聊天应用—ChatGPT。它具有广泛的应用场景&#xff0c…

#QT(串口助手-实现)

1.IDE&#xff1a;QTCreator 2.实验 3.记录 &#xff08;1&#xff09;在widget.h中加入必要文件&#xff0c;并且定义一个类指针 &#xff08;2&#xff09;如果有类的成员不知道怎么写&#xff0c;可以通过以下途径搜索 &#xff08;2&#xff09;设置串口数据 void Widget…

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(一)-向量扩展编程模型

1. 引言 以下是《riscv-v-spec-1.0.pdf》文档的关键内容&#xff1a; 这是一份关于向量扩展的详细技术文档&#xff0c;内容覆盖了向量指令集的多个关键方面&#xff0c;如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量…

CAN总线位时序的介绍

CAN控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平&#xff0c;二者必居其一。发送方通过使总线电平发生变化&#xff0c;将消息发送给接收方。 显性电平对应逻辑 0&#xff0c;CAN_H 和 CAN_L 之差为 2.5V 左右。而隐性电平对应逻辑 1&#xff0c…

【Datawhale组队学习:Sora原理与技术实战】AIGC技术基础知识

AIGC是什么 AIGC全称叫做AI generated content&#xff0c;AlGC (Al-Generated Content&#xff0c;人工智能生产内容)&#xff0c;是利用AlI自动生产内容的生产方式。 在传统的内容创作领域中&#xff0c;PGC&#xff08;Professionally-generated Content&#xff0c;专业生…

HTTP协议与HTTPS协议

HTTP协议 HTTP协议是一个无状态的协议&#xff0c; 服务器不维护任何有关客户端之前所发请求的消息。 是一种懒政&#xff0c;有状态协议就会更加复杂&#xff0c;需要维护状态&#xff08;历史信息&#xff09;,要是客户或者服务器失效,会产生状态不一致(状态前后不对称),解决…

安装RabbitMQ及配置Centos7 方式(2)

1、背景需求 自行搭建学习参考使用&#xff0c;这里采用的Centos7 方式&#xff0c;这已经是多年前的方式了&#xff0c;现在主流方式是容器化安装、部署&#xff0c;docker、ks8&#xff0c;同学们可自行去学习参考。 2、搭建环境 环境&#xff1a;centos7 、otp_src_21.3、…

Redis中的单线程高性能原因和其他高级命令

单线程 Redis是单线程吗&#xff1f; Redis的单线程主要是指Redis的网络IO和键值对读写是由一个线程来完成的&#xff0c;这也是 Redis对外提供键值存储的主要流程。但Redis的其他功能&#xff0c;比如持久化、异步删除、 集群数据同步等&#xff0c;其实是由额外的线程执行的…

已经连接过github远程库,如何再次推送及删除远程库的内容

基于上次将文件推送到已经建好的github远程库上&#xff0c;此篇文章主要介绍如何再次推送文件去直接已经连接过的远程库&#xff0c;以此如何删除远程库中不想要的文件。 一、推送文件到远程库 1.将所需推送的文件拉入本地库所建的文件夹下&#xff1a;{ex&#xff1a;JVM相…

【剑指offer】C++ 翻转字符串里面的单词

目录 题目&#xff1a; 思路&#xff1a; 代码出现 结果 题目&#xff1a; 给定一个字符串&#xff0c;逐个翻转字符串中的每个单词。 示例 1&#xff1a; 输入: "the sky is blue" 输出: "blue is sky the" 示例 2&#xff1a; 输入: " hello…

电磁兼容(EMC):单、双面PCB板设计要点

目录 1 产品设计原则&#xff1a;性价比为第一要素 2 布局设计要点 3 布线设计要点 4 完整地平面不是最优方案 1 产品设计原则&#xff1a;性价比为第一要素 PCB在电磁兼容设计中通常是要求有完整的地和电源平面。但多层价格让对价格敏感的产品望而却步&#xff0c;只能采…

android开发者工具,最新整理

一 Java相关 1.重载函数的签名(区别是否是重载函数) 答&#xff1a;方法名参数类型参数顺序(返回值不是) 2.finalize的工作原理 答&#xff1a;一旦垃圾收集器准备好释放对象占用的存储空间&#xff0c;它首先调用finalize()&#xff0c;而且只有在下一次垃圾收集过程中&#…