| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 面试手写SQL - 求连续3天成绩合格的学生姓名? -> 正文阅读 |
|
[大数据]面试手写SQL - 求连续3天成绩合格的学生姓名? |
面试手写SQL - 求连续3天若干问题,终于会了!前段时间秋招的时候小明去上海某公司面试,被搞懵了,面试官直接当场让其手写SQL,出的题目他当时也懵了,题目听起来不难,但是面试现场给你出题,那种紧张的氛围下是不容易想到的,于是小明课下自己补了作业!
问题分析: 这个题目关键点是如何把连续三天表示出来,这里要在思维上转换一下,不然是很难做出来的,说到底还是SQL写的有点少了。来看问题,连续三天,就是日期连续,如果给你一张表,我们确实很快地从中找出来连续合格的学生,原因只是我们大脑对表很熟悉了,但是让你用程序写出来的话,会发现思维突然卡顿了,所以关键点是把我们从表上读数据的思维程序化。给你一张表,你会先根据某个学生定位到该学生第一次成绩合格的那行,然后根据当前行的日期的下一天去找该学生的成绩有没有合格,如果合格那么继续去看下一天的是否合格,如果有三天连续合格的,那么我们就得到我们想要的结果了,嗯,我们的思维是这样的,我们程序也 应该这样,那么来把我们的这个思维程序化一下,关键点是SQL怎么判断是否有下一天呢,没错,你想到了,exists,这个SQL很强大的功能能帮助我们实现,下面我们来撸代码! 1.建表
2.插入实验数据
3.得到我们待查询的表
用distinct是因为SQL在进行日期判断查找的时候,会从每个日期开始都去找一下有没有连续的天数,因为菜鸟一号是连续四天合格,上面如果不加distinct的话会出现两个菜鸟一号,我们只需要查出合格的学生就行了,所以要去重一下。 5.执行结果
下面介绍一个SQL中特别重要也特别好用的函数 row_number() over(),窗口函数,有了这个函数,你就可以对分组内的数据进行排序,下面对我们上面的SQL进行优化改写,这里对日期连续处理有个小技巧,就是将日期减去每个排序号,正好是一样的值,记住这一点就好做了。
语法格式:row_number() over(partition by 分组列 order by 排序列 desc) partition by是对字段进行分组,和group by 一样可以对某些字段进行分组,但和group by 后面使用 order by不同的是,partition by 后面可以使用 order by对分组内进行排序,然后使用row_number()返回排序号。 关于OVER开窗函数更多用法可以参考一篇文章:https://blog.51cto.com/u_15057820/2650448,看完就恍然大悟了。 1.对学生进行分组,分组内按日期排序
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 7:25:19- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |