-
2021-12-13 21:10:52
大家早上好,本人姓吴,如果觉得文章写得还行的话也可以叫我吴老师。欢迎大家跟我一起走进数据分析的世界,一起学习!
感兴趣的朋友可以关注我的数据分析专栏,里面有许多优质的文章跟大家分享哦。
另外也欢迎大家关注我的SQL刷题专栏,里面有我分享的高质量SQL题,以及详细的解析。
本篇博文又是我的SQL题分享环节,为了记录一下自己的做题过程,以及防止后续力扣会员过期无法再次查看题目,所以我每天都会给大家选出一道质量较高的SQL题目发表到博客上,并且会加上自己的一些解题技巧或实用知识点,希望对大家也能有所帮助。
那么今天给大家分享的题是LeetCode的第811题——寻找面试候选人。
下面是问题的详细描述。
问题描述
表:
Contests
+--------------+------+ | Column Name | Type | +--------------+------+ | contest_id | int | | gold_medal | int | | silver_medal | int | | bronze_medal | int | +--------------+------+ contest_id 是该表的主键. 该表包含LeetCode竞赛的ID和该场比赛中金牌、银牌、铜牌的用户id。 可以保证,所有连续的比赛都有连续的ID,没有ID被跳过。
Table:
Users
+-------------+---------+ | Column Name | Type | +-------------+---------+ | user_id | int | | mail | varchar | | name | varchar | +-------------+---------+ user_id 是该表的主键. 该表包含用户信息。
编写 SQL 语句来返回面试候选人的 姓名和 邮件.当用户满足以下两个要求中的任意一条,其成为面试候选人:
- 该用户在连续三场及更多比赛中赢得奖牌。
- 该用户在三场及更多不同的比赛中赢得金牌(这些比赛可以不是连续的)
可以以任何顺序返回结果。
查询结果格式如下例所示:
Contests表: +------------+------------+--------------+--------------+ | contest_id | gold_medal | silver_medal | bronze_medal | +------------+------------+--------------+--------------+ | 190 | 1 | 5 | 2 | | 191 | 2 | 3 | 5 | | 192 | 5 | 2 | 3 | | 193 | 1 | 3 | 5 | | 194 | 4 | 5 | 2 | | 195 | 4 | 2 | 1 | | 196 | 1 | 5 | 2 | +------------+------------+--------------+--------------+ Users表: +---------+--------------------+-------+ | user_id | mail | name | +---------+--------------------+-------+ | 1 | sarah@leetcode.com | Sarah | | 2 | bob@leetcode.com | Bob | | 3 | alice@leetcode.com | Alice | | 4 | hercy@leetcode.com | Hercy | | 5 | quarz@leetcode.com | Quarz | +---------+--------------------+-------+ 结果表: +-------+--------------------+ | name | mail | +-------+--------------------+ | Sarah | sarah@leetcode.com | | Bob | bob@leetcode.com | | Alice | alice@leetcode.com | | Quarz | quarz@leetcode.com | +-------+--------------------+ Sarah 赢得了3块金牌 (190, 193, and 196),所以我们将她列入结果表。 Bob在连续3场竞赛中赢得了奖牌(190, 191, and 192), 所以我们将他列入结果表。 - 注意他在另外的连续3场竞赛中也赢得了奖牌(194, 195, and 196). Alice在连续3场竞赛中赢得了奖牌 (191, 192, and 193), 所以我们将她列入结果表。 Quarz在连续5场竞赛中赢得了奖牌(190, 191, 192, 193, and 194), 所以我们将他列入结果表。
解题思路
- 第二个条件很容易实现:用roup by gold_medal即可筛选出次数大于等于3的,然后left join一下users表即可得到name和mail。
- 关键是第一个条件,怎么才能连续三场都拿奖牌的人呢?
- 这里分享一个这种类型题的小技巧:用row_number函数,标好每行的序号,然后contest_id减去序号,差相等即代表连续。
- 记住这个小技巧,后面要用到。
- 首先理清我们的目标:查看每一个用户的考试情况,然后看看他有没有连续三次拿奖的情况。
- 怎么查看呢?这里就需要用到表连接,连接的条件是user_id出现在了金银铜中即可。
- 连接完之后呢,用窗口函数,对每个用户分区,并按contest_id排序,排好序之后,用contest_id-序号,得到差值。
- 最后根据用户id和这个差值分组,筛选出组大小不小于3的即可。
- 最终union第二个条件得到的数据即可。
代码实现
select name, mail from ( select name, mail, contest_id - row_number() over(partition by user_id order by contest_id) rn, user_id from Contests join Users on user_id in (gold_medal, silver_medal, bronze_medal) ) as tmp group by user_id, rn having count(1) >= 3 union select name, mail from Contests join Users on gold_medal = user_id group by gold_medal having count(1) >= 3
结束语
看完这篇,还有更多知识点分享给你哦,自己慢慢找哈,就在下面链接。
推荐关注的专栏
👨👩👦👦 机器学习:分享机器学习实战项目和常用模型讲解
👨👩👦👦 数据分析:分享数据分析实战项目和常用技能整理
往期内容回顾
💚 学习Python全套代码【超详细】Python入门、核心语法、数据结构、Python进阶【致那个想学好Python的你】
❤️ 学习pandas全套代码【超详细】数据查看、输入输出、选取、集成、清洗、转换、重塑、数学和统计方法、排序
💙 学习pandas全套代码【超详细】分箱操作、分组聚合、时间序列、数据可视化
💜 学习NumPy全套代码【超详细】基本操作、数据类型、数组运算、复制和试图、索引、切片和迭代、形状操作、通用函数、线性代数
关注我,了解更多相关知识!
CSDN@报告,今天也有好好学习
更多相关内容 -
日常收集整理常见的mysql sql技巧
2020-09-10 05:58:08本篇内容是小编日常收集整理常见的mysql sql技巧,对大家学习mysql sql技巧相关内容有所帮助,感兴趣的朋友一起学习吧 -
一些 T-SQL 技巧
2020-09-11 15:32:13一些 T-SQL 技巧 -
尖端SQL技巧
2018-01-13 19:43:04本书想你揭示了数据库专家挖掘数据并得到他们所需答案的方法。 -
oracle—SQL技巧之(一)连续记录查询sql案例测试
2020-09-10 23:26:13有这样一个需求:需要查询出某个客户某一年那些天是有连续办理过业务,本文给予sql实现语句并测试,感兴趣的朋友可以了解下 -
常用SQL技巧.pdf
2021-03-18 16:34:33SQL常用技术,包含日常数据库维护,查Lock, Kill Lock, 分布式查询及使得SQL导入EXCEL数据等 -
11个常用的SQL技巧
2018-05-04 09:33:4311.推荐一个小插件,SQL Prompt,配合Microsoft SQL Server Management Studio,使用起来非常方便,同时再加上以下几个快捷键: (1)ctrl+5或F5,运行代码,如果想运行特定的语句,那么只是选中该语句,然后F5或ctrl+...1.[]的使用
当我们所要查的表是系统关键字或者表名中含有空格时,需要用[]括起来,例如新建了两个表,分别为user,user info,那么select * from user和select * from user info就要报错,需要写成:select * from [user] 和 select * from [user info],不过千万不要因为有[]的帮助,就随意起名了,那是自找麻烦,不过我确实看到有人把用户表起名为user的。
2.NULLIF函数
NULLIF(Expression1,Expression2):给定两个参数Expression1和Expression2,如果两个参数相等,则返回NULL;否则就返回第一个参数。
等价于:Case WHEN Expression1=Expression2 Then NULL ELSE Expression1。
例如Select NULLIF(1,1)返回NULL,Select NULLIF(1,2)返回1。
有一个实际的应用,例如防止除0操作的放生,可以使用a/NULLIF(b,0),这样就不怕b是0了,当然除0操作也可以通过别的方式判断。
3.NULL
NULL是个神奇的东西,表示空值,未知值,任何数与它加减乘除都返回NULL。
4.ISNULL函数
ISNULL(Expression1,Expression2):给定两个参数Expression1和Expression2,如果Expression1是NULL,那么返回Expression2,否则返回Expression1。
等价于:Case WHEN Expression1 is NULL Then Expression2 ELSE Expression1。
例如Select ISNULL(NULL,1)返回1,Select ISNULL(1,2)返回1。
有一个实际的应用,可以对空值进行默认值替代,例如SELECT ISNULL(email,’没有填写email’) from table1,所有email为null的,用’没有填写email’来替代。
5.COALESCE函数
COALESCE(Expression1,Expression2,Expression3,……):接受一系列的表达式或列,返回第一个非空的值。
例如SELECT COALESCE(NULL,NULL,4,NULL,NULL,5),那么返回4,如果里面的参数都为NULL,那么会报错。
6.WITH TIES
与top()和order by 一起用,可以返回多于top的行。防止丢失想要的信息。
例如:有个表table1
(1)select * from table1 order by name desc :结果如下:
(2)select top(3) * from table1 order by name desc:结果如下:(只有三条)
(3)select top(3) with ties * from table1 order by name desc:结果如下:
7.ORDER BY NEWID():返回随机排序结果。
8.BETWEEN a AND b:返回大于等于a,小于等于b的结果。如果a>b,那么返回NULL。
9.不要在where条件中使用函数,会强制每一行都计算该函数,无法使用索引查找。
例如:select * from table1 where id+3>5和select * from table1 where id>5-3,后者效率比前者高。
10.许多以_desc结尾的列,是为了更友好的表示一个列的含义。
例如:SELECT * FROM sys.databases
11.推荐一个小插件,SQL Prompt,配合Microsoft SQL Server Management Studio,使用起来非常方便,同时再加上以下几个快捷键:
(1)ctrl+5或F5,运行代码,如果想运行特定的语句,那么只是选中该语句,然后F5或ctrl+E即可。
(2)ctrl+L:显示执行计划。
(3)ctrl+R:显示隐藏下面的结果窗口,增大自己书写sql的空间。
(4)ctrl+K,然后按Y,格式化SQL代码。
####################################
转自:https://blog.csdn.net/xishining/article/details/79816781
-
常用 SQL 技巧和常见问题
2018-09-08 15:55:47 RAND()函数与 ORDER BY 字句的配合使用能够实现随机抽取样本的功能,这个技巧在进行数据统计的时候很方便。 GROUP BY 的 WITH ROLLUP 字句能够实现类似于 OLAP 的查询。 BIT 函数与 GROUP BY 子句的联合...1、正则表达式的使用
正则表达式(Regular Expression),是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。
MySQL 利用 REGEXP 命令提供给用户扩展的正则表达式功能,并且 REGEXP 在进行模式匹配时是区分大小写的。2、巧用 RAND()提取随机行
可以利用这个函数与ORDER BY子句一起完成随机抽取某些行的功能。
3、利用 GROUP BY 的 WITH ROLLUP 子句做统计
WITH ROLLUP 反映的是一种 OLAP 思想,也就是说这一个 GROUP BY 语句执行完成后可以满足用户想要得到的任何一个分组以及分组组合的聚合信息值。
注意:1、当使用 ROLLUP 时, 不能同时使用 ORDER BY 子句进行结果排序。换言之, ROLLUP和 ORDER BY 是互相排斥的
2、LIMIT 用在 ROLLUP 后面4、用 BIT GROUP FUNCTIONS 做统计
使用 GROUP BY 语句和 BIT_AND、BIT_OR 函数完成统计工作。
5、数据库名、表名大小写问题
在大多数 UNIX 环境中,由于操作系统对大小写的敏感性导致了数据库名和表名对大小写敏感性,而在 Windows 中由于操作系统本身对大小写不敏感,因此在 Windows 下 MySQL 数据库名和表名对大小写也不敏感。列、索引、存储子程序和触发器名在任何平台上对大小写不敏感。默认情况下,表别名在UNIX 中对大小写敏感,但在 Windows 或 Mac OS X 中对大小写不敏感。
在 MySQL 中如何在硬盘上保存、使用表名和数据库名由 lower_case_tables_name 系统变量决定,可以在启动 mysqld 时设置这个系统变量。
注意:
1、在 UNIX 中将 lower_case_tables_name 设置为 1 并且重启 mysqld 之前,必须先将旧的数据库名和表名转换为小写。
2、尽管在某些平台中数据库名和表名对大小写不敏感,但是最好养成在同一查询中使用相同的大小写来引用给定的数据库名或表名的习惯。6、使用外键需要注意的问题
在 MySQL 中,InnoDB 存储引擎支持对外部关键字约束条件的检查。而对于其他类型存储引擎的表,当使用 REFERENCES tbl_name(col_name)子句定义列时可以使用外部关键字,但是该子句没有实际的效果,只作为备忘录或注释来提醒用户目前正定义的列指向另一个表中的一个列。
总结
应用正则表达式可使用户能在一段很大的字符串中找到符合自己规则的一些语句,这个功能在进行匹配查找的时候非常有用。
RAND()函数与 ORDER BY 字句的配合使用能够实现随机抽取样本的功能,这个技巧在进行数据统计的时候很方便。
GROUP BY 的 WITH ROLLUP 字句能够实现类似于 OLAP 的查询。
BIT 函数与 GROUP BY 子句的联合使用在某些应用场合可以大大降低存储量,提高统计查询效率。
MySQL 数据库名和表名的大小写与操作系统对大小写的敏感性关系密切,因此需要格外引起用户的注意。
MySQL 的外键功能仅对 InnoDB 存储引擎的表有作用,其他类型存储引擎的表虽可以建立外键,但并不能起到外键的作用。
-
SQL技巧全集-整理
2008-08-29 12:42:17整理的SQL技巧全集,包括SQL操作大全,SQL时间显示的不同方式,随机函数,T-SQL技巧等等。。。 -
SQL 技巧与大全
2013-03-19 22:23:28本人收藏的关于SQL语言精粹,经典SQL语句大全,SQL语言艺术等等精品内容,是学习SQL基础和掌握SQL高级应用的好资料! -
MySQL技术内幕 SQL编程及优化.pdf
2019-12-18 17:52:282.5常用SQL技巧 3.优化数据库对象 3.1优化表的数据类型逆规范化 3.2提高查询速度 4.锁问题 4.1MyISQM表锁 4.2InnoDB锁问题 5.优化MySQL Server 5.1MySQL体系结构概览内存管理及优化 5.2InnoDB log机制及... -
MS-SQL开发常用汇总和t-sql技巧集锦
2015-11-25 15:49:52MS-SQL开发常用汇总和t-sql技巧集锦, 实用、易学,值得收藏! -
sql技巧面试题
2012-08-18 08:55:08sql技巧面试题 1、查询数据的最大排序问题(只能用一条语句写) 2、有表A, id pid ----------- ----------- 1 1 1 2 1 3 2 1 2 2 3 1 如何化成表B: id pid ----------- ----------- 1 1,2,3 2 1,2 3 1 -
50条SQL查询技巧、查询语句示例
2020-09-10 08:53:45主要介绍了50条SQL查询技巧、查询语句示例,本文以学生表、课程表、成绩表、教师表为例,讲解不同需求下的SQL语句写法,需要的朋友可以参考下 -
SQl技巧
2016-07-20 17:52:041、统计出regionshort相同的个数sql: SELECT regionshort, count(*) AS total FROM tcity GROUP BY regionshort; 2、Variable sql_mode can't be set to the value of NULL 解决方法 用mysqldump导出的...1、统计出regionshort相同的个数sql:
SELECT
regionshort,
count(*) AS total
FROM
tcity
GROUP BY
regionshort;
2、Variable sql_mode can't be set to the value of NULL 解决方法
用mysqldump导出的数据文件,再用source导进去的时候常常有一些报错,百度了好几回,终于找到是mysql导出的注释语句问题,导出的文件常常 如下:
复制内容到剪贴板
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;source进去常常报下面错误:
解决方法:删除注释语句后再执行批量SQL语句操作
3、解决MySql Error Code:2006–MySQL服务器已离线错误
再用SQLYog进行数据sql导入的时候,出错,后查看日志找到错误代码为:
MySQL 服务器已离线
后经过查询发现时mysql设置的问题.
打开mysql配置文件my.ini(linux为my.cnf),添加或修改max_allowed_packet参数:
# server max allewed packet
max_allowed_packet=100M另外,为了避免等待时间超时,可以将以下两个参数设置大点:
interactive_timeout=28800000
wait_timeout=28800000
4、查看数据库表所占空间
SELECT TABLE_NAME,CONCAT(TRUNCATE(SUM(data_length)/1024/1024,2),'MB') AS data_size,
CONCAT(TRUNCATE(SUM(max_data_length)/1024/1024,2),'MB') AS max_data_size,
CONCAT(TRUNCATE(SUM(data_free)/1024/1024,2),'MB') AS data_free,
CONCAT(TRUNCATE(SUM(index_length)/1024/1024,2),'MB') AS index_size
FROM information_schema.tables WHERE TABLE_NAME = 't_user_operate';
SELECT TABLE_NAME,DATA_LENGTH+INDEX_LENGTH,TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA='launcher_hb';
-
高性能FlinkSQL优化技巧
2021-03-01 15:55:59MicroBatch和MiniBatch都是微批处理,只是微批的触发机制略有不同。原理同样是缓存一定的数据后再触发处理,以减少对State的访问,从而提升吞吐并减少数据的输出量。...MicroBatch是MiniBatch的升级版,主要基于事件... -
SQL技巧 常用SQL操作语句
2009-08-28 17:01:29SQL小技巧:QL小技巧,常看。 说明:复制表(只复制结构,源表名:a 新表名:b) SQL: select * into b from a where 1<>1 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) SQL: insert into b(a, b, c) select d,e,... -
SQL注入绕过的技巧总结
2020-12-14 22:23:54SQL注入的绕过技巧有很多,具体的绕过技巧需要看具体的环境,而且很多的绕过方法需要有一个实际的环境,好是你在渗透测试的过程中遇到的环境,否则如果仅仅是自己凭空想,那显然是不靠谱的。这篇文章是总结我在... -
Oracle 常用SQL技巧经典收藏
2011-02-17 23:33:15Oracle 常用SQL技巧经典收藏 Oracle 常用SQL技巧经典收藏 -
oracle 数据库的sql优化技巧
2018-09-08 18:49:19oracle数据库的sql优化技巧,方便自己写出高效,简洁,实用的sql语句。 -
数据库查询优化复盘-20条必备sql优化技巧
2020-12-08 08:29:00参考: 《数据库高效优化:架构、规范与SQL技巧》 《拉勾教育专栏:高性能MySQL实战》 -- END -- - | 更多精彩文章 - Java日志体系总结 面试扫雷: String的长度最大是多长? Mybatis源码解读 - 设计模式剖析 Nginx... -
SQLSERVER SQL性能优化技巧
2020-09-10 07:08:08主要介绍了SQLSERVER SQL性能优化技巧,需要的朋友可以参考下 -
sql技巧-产生连续日期(时间)序列
2021-06-10 09:39:06要求:通过sql生成一段连续的日期,入2021-01-01至2021-01-31 参考实现: d -
写sql的技巧
2020-08-21 23:28:10写sql的时候,新手容易一开始无从下手,有个技巧是,sql分类起来是三种: 1、select 语句 2、group by 分组语句 3、join 连接语句 平常写的sql,大多数是这三种的组合,另外聚合和排序是和这三种语句结合使用的... -
Informix SQL 技巧
2009-08-23 20:10:48Informix SQL 技巧,适用出初学者 -
sql server查询时间技巧分享
2020-12-15 17:03:161、将时间转换为字符串的形式: 代码如下: convert(varchar,字段名,120)——–yyyy-mm-ddhh:ss:mm0000 convert(char(10),字段名,120)——yyyy-mm-dd 2、如果使用的是sql编辑器(微软自带的工具),查询日期不需要使用... -
SQL语句技巧:按月统计数据
2020-09-14 15:37:12SQL语句技巧:按月统计数据 -
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
2021-01-20 01:26:37本文实例讲述了PHP防止sql注入小技巧之sql预处理原理与实现方法。分享给大家供大家参考,具体如下: 我们可以把sql预处理看作是想要运行的 SQL 的一种编译过的模板,它可以使用变量参数进行定制。 我们来看下它有... -
sql高级技巧几个有用的Sql语句
2020-09-14 14:30:42sql语句对于数据的一些操作,根据另外一个表的内容修改第一个表的内容