【SQL篇】窗口函数和公共表达式

news2024/12/23 0:03:52

1077 项目员工 III

在这里插入图片描述

# Write your MySQL query statement below
select project_id, employee_id
from (
    select project_id, e.employee_id, rank() over(partition by project_id order by experience_years desc) as rk
    from Employee e
    join Project p
    on e.employee_id = p.employee_id
) tmp
where tmp.rk = 1;

1285 找到连续区间的开始和结束数字

在这里插入图片描述

# Write your MySQL query statement below
select min(log_id) as start_id, max(log_id) as end_id
from (
    select log_id, log_id - rank() over(order by log_id) as num
    from Logs
) t
group by num

思路

  1. 先给每个数进行排名
  2. 用这些数减去自己的排名,如果减了之后的结果是一样的,说明这几个数是连续的
  3. 用logid减去排名得出来的数进行group by,也就是把连续的数全都放在一个一个小组里面,求出每个小组的最大值和最小值就可以了

1596 每位顾客最经常订购的商品

  • 1596题
select t.customer_id, t.product_id, p.product_name
from (
    select customer_id, product_id,
    rank() over(partition by customer_id order by count(product_id) desc) as rk
    from Orders
    group by customer_id, product_id
) t
join Products p
on t.product_id = p.product_id
where rk = 1

总结

  • 这里有个坑,count并不会根据partition来分组,所以必须根据group by 来分组计算出count的数量;其次group by在窗口函数之前执行。

1709 访问日期之间最大的空档期

在这里插入图片描述

select user_id, max(datediff(next_visit, visit_date)) as biggest_window
from (
    select  user_id, 
            visit_date, 
            lead(visit_date, 1, "2021-01-01") over(partition by user_id 
            order by visit_date) as next_visit
    from UserVisits
) tmp
group by user_id
order by user_id;

总结

  • 注意lead(x,y,z) over()的参数,x代表要寻找的列,y代表往后走几个位置,z代表当x+y找不到记录时的默认值。

    此题中lead(visit_date,1,‘2021-01-01’)就说明要寻找的是visit_date列,1代表visit_date往后走1条记录,‘2021-01-01’代表往后走找不到记录时,默认为’2021-01-01’。这里的前后是指用order by排序过后的前后。

1270 向公司CEO汇报工作的所有人

在这里插入图片描述

# 写法1
select employee_id from Employees
where manager_id in(
    select employee_id from Employees
    where manager_id in
    (select employee_id from Employees where manager_id=1) 
) and employee_id <> 1;

# 写法2
select distinct e1.employee_id
from Employees e1,Employees e2, Employees e3
where e1.manager_id=e2.employee_id and e2.manager_id=e3.employee_id
and e3.manager_id=1 and e1.employee_id !=1

总结

  • 思路1:嵌套查询
  • 思路2:三表联合,该方法只有在老板的employee_id=manager_id时才生效。
  • 对于思路2,一开始疑惑的点为什么不是四表查询,一开始认为employee_id=7这个员工无法查询得到,但如果画出表来我们可以发现。表三中employee_id=2,manager_id=1的记录可以被查询出来,如下:
 ["employee_id", "employee_name", "manager_id", #表1
 "employee_id", "employee_name", "manager_id", #表2
 "employee_id", "employee_name", "manager_id"] #表3
  [7, "Luis", 4, 
  4, "Daniel", 2, 
  2, "Bob", 1]

1412 查找成绩处于中游的学生

  • 1412题
# 写法1
select distinct e.student_id, student_name
from Exam e
left join Student s
on e.student_id = s.student_id
where e.student_id not in (
    select student_id from Exam 
    where (exam_id, score) in ((select exam_id, max(score) from Exam group by exam_id) 
    union all (select exam_id, min(score) from Exam  group by exam_id))
)
order by student_id;

# 写法2
# 根据成绩升序和降序排序,根据学生id分组,去掉成绩排名中为1的记录
select e.student_id, student_name
from (
    select student_id, 
    rank() over(partition by exam_id order by score desc) max_score_rk,
    rank() over(partition by exam_id order by score) min_score_rk
    from Exam
) e
left join Student s
on e.student_id = s.student_id
group by e.student_id
having min(e.max_score_rk) <> 1 and min(e.min_score_rk) <> 1
order by e.student_id;

1767 寻找没有被执行的任务对

  • 1767题
with recursive t as 
(
    select task_id, subtasks_count subtask_id from Tasks
    union all
    select task_id, subtask_id-1 from t where subtask_id > 1
)

select t.task_id, t.subtask_id
from t
left join Executed e
on t.task_id = e.task_id and t.subtask_id = e.subtask_id
where e.subtask_id is null;

总结

通过recursive直接生成每个任务对应的所有可能的(主任务id, 子任务id)组合,下面是recursive的用法。

WITH RECURSIVE cte (n) AS
( select 初始值 from table
union all
select 递归内容 from cte where (终止条件)
)

参考

  1. 1285题思路
  2. 行转列7种方法

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

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

相关文章

【Fluent】接着上一次计算的结果继续计算,利用计算过程中得到的物理场(温度、速度、压力等)插值Interpolate文件初始化模型的方法

一、问题背景 因为fluent中支持的初始化无非三种类型。 1、Standard initialization 标准初始化 2、Hybridinitialization 混合初始化 3、FMG initialization FMG初始化 另外&#xff0c;还可以用UDF通过坐标判断的方式予以初始化。 但是这些初始化方法都没办法利用以前计算过…

通关MyBatis(上)

作者&#xff1a;~小明学编程 文章专栏&#xff1a;spring框架 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 什么是MyBatis 如何使用Mybatis 添加依赖 创建数据库 配置数据库连接字符串 MyBatis的操作流程 数据持久层 配置mybatis的xml文件 mapp…

Windows自动虚拟机WSL和VMware虚拟机兼容问题(此平台不支持虚拟化的 Intel VT-x/EPT)

问题背景与原因分析 在安装了WSL2之后&#xff0c;忽然发现VMware Workstation无法正常启动了。就是在开启虚拟机时遇到了这种情况&#xff1a; “ 此平台不支持虚拟化的 Intel VT-x/EPT” 问题描述&#xff1a;出现以上问题&#xff0c;发现WSL2和 VMware Workstation 是不兼…

idea使用git遇到的小问题

idea使用git遇到的小问题 前置说明颜色含义中文插件修改提交的用户名 前置说明 idea版本为2022专业版 github需要自己会科学上网 颜色含义 在idea中使用github后&#xff0c;会发现项目中会有各种各样的颜色&#xff0c;如图所示文件全为绿色 这颜色含义分别为&#xff1a;…

函数-函数递归及练习

目录 1、什么是递归&#xff1f; 2、递归的两个必要条件 3、递归的练习 3.1 接受一个整型值&#xff08;无符号&#xff09;&#xff0c;按照顺序打印它的每一位 3.2 编写函数不允许创建临时变量&#xff0c;求字符串的长度 3.3 求第n个斐波那契数 3.4 字符串逆序&…

UG NX二次开发(C++)-建模-修改NXObject或者Feature的颜色(二)

文章目录 1、前言2、在UG NX中修改Body的颜色操作3、采用NXOpen(C)实现3.1 创建修改对象颜色的方法3.2 在do_it()中添加调用的代码3.3 测试效果 1、前言 在UG NX中&#xff0c;改变NXObject和Feature的操作是不相同的&#xff0c;所以其二次开发的代码也不一样&#xff0c;我们…

企业级信息系统开发讲课笔记4.1 Spring Boot入门程序

文章目录 零、学习目标一、Spring Boot框架概述&#xff08;一&#xff09;由Spring到Spring Boot&#xff08;二&#xff09;Spring Boot框架的核心功能&#xff08;三&#xff09;Spring Boot框架的应用 二、使用Maven方式构建Spring Boot项目&#xff08;一&#xff09;创建…

二维字符数组的三种输入方式浅析(scanf()、gets()和fgets())

二维字符数组的输入 目录 二维字符数组的输入1.scanf函数知识点scanf()关于回车的问题&#xff1a; 2.gets函数3.fgets函数参考链接 1.scanf函数 知识点 按照常规输入数组的办法&#xff0c;通过 for 循环实现 将整个字符串输入时&#xff0c;在数组名前不加&&#xff0…

Java 基础进阶篇(二)—— static 静态关键字与单例模式

文章目录 一、static 静态关键字1.1 静态成员变量与实例成员变量1.2 静态成员方法与实例成员方法1.3 static 访问注意事项1.4 内存使用情况 二、工具类三、代码块四、单例模式4.1 饿汉单例4.2 懒汉单例 一、static 静态关键字 static&#xff1a;代表静态的意思&#xff0c;可…

Java 基础进阶篇(六)—— 接口详解

文章目录 一、接口概述二、接口的基本使用三、接口从 JDK 8 开始新增的方法四、接口的注意事项&#xff08;了解&#xff09;补充&#xff1a;接口与接口的关系 一、接口概述 规范的基本特征是约束和公开。 接口就是一种规范&#xff0c;其约束别人必须干什么事情。 所以&…

【五一创作】Matlab 绘制风速、风向统计玫瑰花图【优化】

在之前&#xff0c;有个博客专门讲matlab 绘制风速、风向统计玫瑰花图&#xff1b;这里面存在不少细节问题&#xff0c;目前对该部分代码做了优化。以前的博客链接见下&#xff1a; Matlab 绘制风速、风向统计玫瑰花图 最近接了一个任务&#xff0c;需要绘制风速、风向的统计玫…

Java 基础进阶篇(五)—— 抽象类与模板方法设计模式

文章目录 一、抽象类、抽象方法概述二、抽象类的特征三、模板方法设计模式3.1使用场景3.2 实现步骤3.3 写作文案例 补充&#xff1a;final 和 abstract 是什么关系? 一、抽象类、抽象方法概述 在 Java 中 abstract 是抽象的意思&#xff0c;可以修饰类、成员方法。 abstract …

Java 基础进阶篇(七)—— 面向对象三大特征之三:多态

文章目录 一、多态的概述二、多态中成员访问特点 ★三、多态的优势与劣势四、多态下的类型转换4.2 自动类型转换&#xff08;从子到父&#xff09;4.2 强制类型转换&#xff08;从父到子&#xff09;4.3 instanceof 关键字 一、多态的概述 多态&#xff1a;是指执行同一个行为…

Java 基础进阶篇(四)—— 权限修饰符、final 关键字与枚举

文章目录 一、权限修饰符二、final 关键字2.1 final 作用2.2 final 修饰变量举例2.3 常量 三、枚举3.1 枚举的格式3.2 枚举的特征3.3 枚举的应用 一、权限修饰符 权限修饰符 用于约束成员变量、构造器、方法等的访问范围。 权限修饰符&#xff1a; 有四种作用范围由小到大 (p…

Java 基础进阶篇(三)—— 面向对象的三大特征之二:继承

文章目录 一、继承概述二、内存运行原理 ★三、继承的特点四、继承后&#xff1a;成员变量和方法的访问特点五、继承后&#xff1a;方法重写六、继承后&#xff1a;子类构造器的特点七、继承后&#xff1a;子类构造器访问父类有参构造器八、this、super 总结 一、继承概述 Jav…

机器学习之利用SMO算法求解支持向量机—基于python

大家好&#xff0c;我是带我去滑雪&#xff01; 本期将讨论支持向量机的实现问题&#xff0c;我们知道支持向量机的学习问题可以化为求解凸二次规划问题。这样的凸二次规划问题具有全局最优解&#xff0c;并且有许多最优化算法可以用于这一问题的求解。但是当训练样本容量很大…

【C++】 探索程序 详细解读程序在运行过程中都发生了什么

目录 头文件-源代码 头文件重复包含 问题 解决方案 程序生成过程 预处理Preprocessi 编译Compilation 汇编Assembly 链接Linking 编译期-运行期 编译期确定 运行期确定 编译期错误 运行期错误 类和对象 宏 宏的其他用法 inline内联 头文件-源代码 头文件&…

Vue简介和常用指令

概述&#xff1a; MVVM思想&#xff1a;视图层数据和数据模型里面的数据发生变化都会影响到另一边的数据&#xff0c;通过ViewModel自动实现。 Vue入门案例 步骤&#xff1a; 上面提到了数据模型和试图层的数据是关联的&#xff0c;此处数据模型里面el的值就是选择了哪一个视…

jQuery引入----练习

jQuery引入----练习 html <!DOCTYPE html> <html><head><title>jQuery引入</title><!-- css样式引入 --><link rel"stylesheet" href"../css/a.css"><!-- jquery函数库引入 --><script type"tex…

Linux基础IO【深入理解文件系统】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、磁盘文件2、磁盘概念2.1、基本结构2.2、数据存储 3、磁盘信息3.1、分区意义…