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

这篇具有很好参考价值的文章主要介绍了【SQL篇】窗口函数和公共表达式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1077 项目员工 III

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

# 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 找到连续区间的开始和结束数字

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

# 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 访问日期之间最大的空档期

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

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汇报工作的所有人

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

# 写法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的用法。文章来源地址https://www.toymoban.com/news/detail-432377.html

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

参考

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

到了这里,关于【SQL篇】窗口函数和公共表达式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • sqlserver  sql 异常<除非另外还指定了 TOP、OFFSET 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。>

    问题:使用sql查询时报错 解决办法:在sql子查询SELECT 后加 TOP 100 PERCENT (查询出前百分比为100的数据,也就是查询出全部数据) ,如下

    2024年02月15日
    浏览(80)
  • sql进阶 之case表达式

    CASE表达式是SQL里非常重要而且使用起来非常便利的技术,我们应该学会用它来描述条件分支。本节将通过 行列转换、已有数据重分组(分类)、与约束的结合使用、针对聚合结果的条件分支 等例题,来介绍CASE表达式的用法。标红即为他的作用 先读如下文章 明白mysql是行引

    2024年02月15日
    浏览(37)
  • SQL中常见正则表达式用法

    在 SQL 中,正则表达式是一种强大的工具,用于匹配相应的字符串模式。SQL 支持的正则表达式语法因数据库而异,下面是一些常用的正则表达式元字符: . :匹配任何单个字符 * :匹配任意数量的前一个字符 + :匹配一个或多个前一个字符 ? :匹配零个或一个前一个字符 ^ :

    2024年02月15日
    浏览(64)
  • 探索Python中的函数式编程:Lambda表达式与函数式工具【第135篇—Lambda表达式】

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在Python编程世界中,函数式编程逐渐成为了一种流行的范式,特别是在处理数据和编写简洁、高效代码时。函数式编程的核心思想是将计算视

    2024年04月08日
    浏览(86)
  • 030、SQL语句之数据类型与表达式

    类型 存储空间 最小值(有符号/无符号) 最大值(有符号/无符号) TINYINT 1 -128 / 0 127 / 255 SMALLINT 2 -32768 / 0 32767 / 65535 MEDIUMINT 3 -8388608 / 0 8388607 / 16777215 INT 4 -2147483648 / 0 BIGINT 8 -9223372036854775808 / 0 9223372036854775807 / 18446744073709551615 注意unsigned: 不允许负数 用于精确数值:整数、小数或两

    2024年02月13日
    浏览(47)
  • 【C++】STL 算法 ② ( foreach 循环中传入 函数对象 / Lambda 表达式处理元素 | foreach 循环算法 | Lambda 表达式 - 匿名 函数对象 / 仿函数 )

    在 C++ 语言中 , std::foreach 循环 虽然 不是标准库的一部分 , 但是 C ++ 编译器 提供了对 该语法 的支持作为扩展 ; 使用 该 std::foreach 循环 , 可以用于 遍历 STL 标准模板库 中提供的容器 , 如 vector 单端数组 , list 双向链表 , map 映射 , set 集合 等 容器 中的元素 ; std::for_each 是一个算

    2024年02月02日
    浏览(65)
  • SQL 中的 CASE 表达式妙用,涨姿势了。。

    历史考试选择题:黄花岗起义第一枪谁开的? A宋教仁 B孙中山 C黄兴 D徐锡麟,考生选C。 又看第二题:黄花岗起义第二枪谁开的? 考生傻了,就选了个B。 接着看第三题:黄花岗起义中,第三枪谁开的? 考生疯了,胡乱选了A。 考试出来就去找出卷老师。老师拿出课本说:黄兴连

    2024年02月03日
    浏览(45)
  • GaussDB SQL基本语法示例-CASE表达式

    目录 一、前言 二、CASE Expression(CASE表达式)介绍 三、GaussDB数据库中的简单CASE表达式 1、基本概念 2、基本语法 3、示例 四、GaussDB数据库中的搜索CASE表达式 1、基本概念 2、基本语法 3、示例 五、小结 SQL是用于访问和处理数据库的标准计算机语言。GaussDB支持SQL标准(默认支

    2024年02月08日
    浏览(77)
  • js 函数声明和函数表达式的执行结果

    参考:https://juejin.cn/post/7237051958993469496 推荐:看 《你不知道的 JavaScript》,里面有详细的 js 执行细节,看完很有收获。

    2024年02月08日
    浏览(42)
  • 如何使用SQL系列 之 如何在SQL中使用CASE表达式

    编程语言通常以 条件语句 为特征,它们是执行特定操作直到满足特定条件的命令。一个常见的条件语句是 if, then, else 语句,它通常遵循以下逻辑: 这条语句的逻辑可以翻译成如下语言:“如果 condition 为真,那么perform action A 。否则(else),执行 动作B 。” CASE 表达式是结构化查

    2024年02月09日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包