leetcode数据库题第六弹

news2025/1/16 13:47:09

leetcode数据库题第六弹

  • 626. 换座位
  • 1280. 学生们参加各科测试的次数
  • 1321. 餐馆营业额变化增长
  • 1327. 列出指定时间段内所有的下单产品
  • 1341. 电影评分
  • 1378. 使用唯一标识码替换员工ID
  • 1393. 股票的资本损益
  • 1407. 排名靠前的旅行者
  • 1484. 按日期分组销售产品
  • 1517. 查找拥有有效邮箱的用户
  • 1527. 患某种疾病的患者
  • 小结

626. 换座位

https://leetcode.cn/problems/exchange-seats/

嗯,今天又看了看这个题目,发现用例已经修复了。

# mysql && oracle
select floor((id - 1) / 2) * 2 + row_number() over(partition by floor((id - 1) / 2) order by id desc) id ,student
from seat
# mssql
select (id - 1) / 2 * 2 + row_number() over(partition by (id - 1) / 2 order by id desc) id ,student
from seat
# mssql && mysql
# 这个是抄评论里的内容,可惜不直到怎么调整的能够支持 oracle
select rank() over (order by (id - 1) ^ 1) id, student
from Seat

1280. 学生们参加各科测试的次数

https://leetcode.cn/problems/students-and-examinations/

额。。。统计所有人,所有科目,各进行了几次考核。。。那么人员和科目只能最大化交叉查询了,然后再去关联考试次数。

其实指令是一拖三的,把空值处理换成各自的函数即可:

oracle : nvl
mysql : ifnull
mssql : isnull

# oracle
select a.*,nvl(cnt,0) attended_exams 
from (
    select * from students,subjects
) a
left join (
    select student_id,subject_name,count(0) cnt
    from examinations
    group by student_id,subject_name
) b on a.student_id=b.student_id and a.subject_name=b.subject_name
order by a.student_id,a.subject_name

CSDN 文盲老顾的博客,https://blog.csdn.net/superwfei

1321. 餐馆营业额变化增长

https://leetcode.cn/problems/restaurant-growth/

额。。。。根据日期进行关联,还得限定输出的日期范围,难度不高,就是写起来挺麻烦,这就已经接近日常工作的样子了。

主要的是 mysql 和 mssql 的 datediff 的用法,差异不小哦,需要仔细查询各自的语法和差计算方式,哪个日期在前,哪个日子在后。

# mysql
select a.visited_on,sum(c.amount) amount,round(sum(c.amount) / 7,2) average_amount
from (
    select distinct visited_on 
    from customer c
    where exists(
        select 1 
        from customer
        where datediff(c.visited_on,visited_on)=6
    )
) a
inner join customer c on datediff(a.visited_on,c.visited_on)<=6 and datediff(a.visited_on,c.visited_on) >= 0
group by a.visited_on
order by a.visited_on
# mssql
select a.visited_on,sum(c.amount) amount,convert(decimal(16,2),sum(c.amount) * 1.0 / 7) average_amount
from (
    select distinct visited_on 
    from customer c
    where exists(
        select 1 
        from customer
        where datediff(d,visited_on,c.visited_on)=6
    )
) a
inner join customer c on datediff(d,c.visited_on,a.visited_on)<=6 and datediff(d,c.visited_on,a.visited_on) >= 0
group by a.visited_on
order by a.visited_on
# oracle
select to_char(a.visited_on,'YYYY-mm-DD') visited_on,sum(c.amount) amount,round(sum(c.amount) * 1.0 / 7,2) average_amount
from (
    select distinct visited_on 
    from customer c
    where exists(
        select 1 
        from customer
        where c.visited_on - visited_on = 6
    )
) a
inner join customer c on c.visited_on between a.visited_on - 6 and a.visited_on
group by a.visited_on
order by a.visited_on

1327. 列出指定时间段内所有的下单产品

https://leetcode.cn/problems/list-the-products-ordered-in-a-period/

嗯,日期范围,可以用 between 来描述,这样就可以一拖三了。至于不少于100的销售量,用having聚合筛选一下就好。

select p.product_name,sum(o.unit) unit 
from products p
inner join orders o on p.product_id=o.product_id
where o.order_date between '2020-2-1' and '2020-2-29'
group by p.product_name
having(sum(o.unit)>=100)

1341. 电影评分

https://leetcode.cn/problems/movie-rating/

额。完全两个不同的查询条件,聚合方式,然后得到两个结果集,放到一起输出。。。这个考的内容,不具有通用性。。。。算了,随便写写吧。

嗯,下边的内容,并不是某数据只能使用这一种方式,而是,在不同的数据里,用不同的方式进行实现了,小伙伴们也可以用任意数据库按照特定方式去实现查询结果。

# mysql
select * 
from (
    select name results
    from movierating m
    inner join users u on m.user_id=u.user_id
    group by name
    order by count(0) desc,name
    limit 0,1
) a
union all
select * 
from (
    select title results
    from movierating r
    inner join movies m on r.movie_id=m.movie_id
    where created_at between '2020-2-1' and '2020-2-29'
    group by title
    order by avg(rating) desc,title
    limit 0,1
) b
# oracle
select * 
from (
    select u.name results
    from movierating m
    inner join users u on m.user_id=u.user_id
    group by name
    order by count(0) desc,name
) a
where rownum=1
union all
select * 
from (
    select m.title results
    from movierating r
    inner join movies m on r.movie_id=m.movie_id
    where r.created_at between '2020-2-1' and '2020-2-29'
    group by title
    order by avg(r.rating) desc,title
) b
where rownum=1
# 一拖三,除了 mssql, * 1.0 都可以省略
select a.name results 
from (
    select a.*,row_number() over(partition by tp order by cnt desc,name) nid 
    from (
        select u.name,sum(1) over(partition by u.user_id order by r.created_at) cnt,'1' tp
        from users u
        inner join MovieRating r on u.user_id=r.user_id
        union all
        select m.title,avg(rating * 1.0),'2' tp 
        from Movies m
        inner join MovieRating r on m.movie_id=r.movie_id
        where created_at >= '2020-2-1' and created_at < '2020-3-1'
        group by title
    ) a
) a
where a.nid=1

1378. 使用唯一标识码替换员工ID

https://leetcode.cn/problems/replace-employee-id-with-the-unique-identifier/

啊哦,又考回到 left join 了,完全没什么其他想法啊。

select u.unique_id,e.name 
from Employees e
left join EmployeeUNI u on e.id=u.id

1393. 股票的资本损益

https://leetcode.cn/problems/capital-gainloss/

嗯?这个题目居然被定为中等难度?没看出来啊,不还是 group 和 sum 的问题吗?哦,难道一个 case when 就算一个难度了?

# 一拖三
select a.stock_name,sum(p) capital_gain_loss 
from (
    select s.*,(case when operation = 'Buy' then -price else price end) p
    from stocks s
) a
group by a.stock_name

1407. 排名靠前的旅行者

https://leetcode.cn/problems/top-travellers/submissions/

额。。。还是 left join 一个聚合结果。。。

# oracle
select a.name,nvl(b.d,0) as travelled_distance 
from users a 
left join (
    select user_id,sum(distance) d
    from rides
    group by user_id
) b on a.id=b.user_id 
order by nvl(b.d,0) desc,a.name
# mssql
select name,isnull(d,0) travelled_distance
from users a
left join (
    select user_id,sum(distance) d
    from rides
    group by user_id
) b on a.id=b.user_id
order by d desc,name
# mysql
select name,ifnull(sum(distance),0) travelled_distance
from users a
left join rides r on r.user_id=a.id
group by a.id
order by travelled_distance desc,name

1484. 按日期分组销售产品

https://leetcode.cn/problems/group-sold-products-by-the-date/

哦,终于用到 group_concat 或 for xml 了,可惜老顾对 oracle 不熟悉,不知道怎么在 oracle 里搞出这个结果

# mysql
select sell_date,count(distinct product) num_sold,group_concat(distinct product order by product) products
from Activities
group by sell_date
order by sell_date
# mssql
select distinct sell_date,len(products) - len(replace(products,',','')) + 1 num_sold,products 
from Activities a
cross apply (
    select stuff((
        select distinct ',' + product
        from Activities 
        where sell_date=a.sell_date
        order by ',' + product
        for xml path('')
    ),1,1,'') products
) b
order by sell_date

1517. 查找拥有有效邮箱的用户

https://leetcode.cn/problems/find-users-with-valid-e-mails/

额。。。。这个题目,有官方正则支持的,很容易,而 mssql 因为没有官方正则支持。。。只能验字符串了。。。。还好 tsql 的 like 也有类似的正则用法,虽然并不是完整的正则。

# mysql
select * 
from Users
where mail regexp '^[a-zA-Z][a-zA-Z0-9_\.-]*@leetcode[\.]com$'
# oracle
select * 
from Users
where regexp_like(mail,'^[a-zA-Z][a-zA-Z0-9_\.-]*@leetcode[\.]com$')
# mssql
select *
from users 
where mail like '[a-zA-Z]%@leetcode.com'
and substring(mail,0,len(mail) - 12) not like '%[^a-zA-Z0-9_.-]%'

1527. 患某种疾病的患者

https://leetcode.cn/problems/patients-with-a-condition/

嗯嗯。这个题目,还是正则比 like 好用,尤其是 like 需要 or 的时候,效率太低了。

# mssql
select * 
from patients
where ',' + replace(conditions,' ',',') like '%,diab1%'
# mysql
select * 
from Patients
where conditions regexp '(?<![a-z0-9A-Z])DIAB1'
# oracle
select * 
from Patients
where regexp_like(conditions,'(^| )DIAB1')

小结

额,这次10个题目,算是考的比较全面了,尤其是分组字符串合并,是一个很常用的内容,然后,就是正则这种匹配,也算是很常用的内容了。

但是,在没有正则的情况下,对于确定的字符串内容,其实我们还是有变动的办法的,嗯,这次有两个题目就是用 like 进行变通得到正确结果的。

所以说,一定要了解清楚,到底每个指令,都有哪些功能,能进行怎样的操作。

所有华丽的招式,都是有基础的动作构成的,只有了解了所有的基础内容,才能无招胜有招的完成所有需求。

在这里插入图片描述

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

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

相关文章

数字基带传输

常用码型&#xff1a; 为了适应信道的传输&#xff0c;传输码型必须具备以下基本特性&#xff1a; 1&#xff09;无直流、很少的低频分量&#xff1b; 2&#xff09;含有码元定时信息&#xff1b; 3&#xff09;主瓣宽度窄&#xff1b; 4&#xff09;适用于各种信源的…

ChatGPT从入门到精通,一站式掌握办公自动化/爬虫/数据分析和可视

课程名称适应人群ChatGPT从入门到精通&#xff0c;一站式掌握办公自动化/爬虫/数据分析和可视 全面AI时代就在转角&#xff0c;道路已经铺好了“局外人”or“先行者”就在此刻等你决定 1、对ChatGPT感兴趣并希望有人手把手教学的新手 2、希望了解GPT各类应用抓住未来风口 3、希…

【软件设计师暴击考点】UML知识高频考点暴击系列

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件…

【Android Framework系列】第2章 Binder机制大全

1 Binder简介 1.1 什么是Binder Binder是Android中主要的跨进程通信方式。Android系统中&#xff0c;每个应用程序是由Android的Activity&#xff0c;Service&#xff0c;BroadCast&#xff0c;ContentProvider这四剑客中一个或多个组合而成&#xff0c;这四剑客所涉及的多进程…

【瑞萨RA_FSP】IWDT——独立看门狗定时器

文章目录 一、IWDT简介二、IWDT功能框图剖析1. IWDT 时钟源(1) 计数器时钟(2) 独立看门狗超时时间计算 2. IWDT 模块电路功能讲解3. 独立看门狗&#xff08;IWDT&#xff09;与看门狗&#xff08;WDT&#xff09;功能对比4. 怎么使用IWDT 三、IWDT实验1. 硬件设计2. 文件结构3.…

交通 | 考虑供需交互下的航空网络优化问题

编者按&#xff1a; 本文提出了一种包含供需交互作用的航空网络规划模型 (ANPSD)&#xff0c;该模型同时考虑了航线选择、航班频率和机队组成等问题&#xff0c;还捕捉了航空公司的供应和乘客需求之间的相互依赖关系。作者将需求实证函数与 ANPSD 模型相结合&#xff0c;开发了…

代码随想录算法训练营第四十四天|完全背包、518. 零钱兑换 II 、377. 组合总和 Ⅳ

完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同…

【数据结构】顺序表,链表

前言 小亭子正在努力的学习编程&#xff0c;接下来将开启 javaEE 的学习~~ 分享的文章都是学习的笔记和感悟&#xff0c;如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话&#xff0c;烦请点赞关注支持一波, 感激不尽~~ 目录 前言 顺序表 ArrayList ArrayLi…

K8S存储值之PV和PVC

1. 概念&#xff1a; 1.1. PersistentVolume (PV)&#xff1a; 是由管理员设置的存储&#xff0c;它是群集的一部分。就像节点是集群中的资源一样&#xff0c;PV也是集群中的资源。PV是Volume之类的卷插件&#xff0c;但具有独立于使用PV的Pod的生命周期。此API对象包含存储实…

数字图像处理-图像复原与重建

文章目录 一、图像退化/复原过程的模型二、噪声模型2.1噪声的空间和频率特性2.2一些重要的噪声概率密度函数2.2.1高斯噪声2.2.2瑞利噪声2.2.3爱尔兰&#xff08;伽马&#xff09;噪声2.2.4指数噪声2.2.5均匀噪声2.2.6脉冲&#xff08;椒盐&#xff09;噪声 2.3周期噪声 三、只存…

【ABAP】数据类型(四)「类型组TYPE-POOL」

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成,对SAP企业管理系统,SAP ABAP开发和数据库具有较…

基于电容电流前馈与电网电压全前馈的三相LCL并网逆变器谐波抑制MATLAB仿真

基于电容电流前馈&#xff0b;电网电压全前馈的三相并网逆变器谐波抑制MATLAB仿真资源-CSDN文库https://download.csdn.net/download/weixin_56691527/87940934模型简介&#xff1a; 测试环境为MATLAB2021b 一共包含两个模型&#xff1a;一个是传统无改进模型&#xff0c;一个…

chatgpt赋能python:Python画运动轨迹:探索世界的足迹

Python画运动轨迹&#xff1a;探索世界的足迹 作为一门快速发展的编程语言&#xff0c;Python在数据分析、机器学习、Web开发等多个领域中发挥着举足轻重的作用。其中&#xff0c;画运动轨迹是Python可视化库中较为常见的应用之一。本文将介绍使用Python画运动轨迹的方法&…

chatgpt赋能python:Python画点函数:如何绘制并掌握基础图形?

Python画点函数&#xff1a;如何绘制并掌握基础图形&#xff1f; Python是一个极为强大的编程语言&#xff0c;它可以用来编写各种应用程序&#xff0c;包括绘图。绘图是Python的重要特性之一&#xff0c;它提供了各种绘图函数&#xff0c;包括画点函数。Python的画点函数是一…

chatgpt赋能python:Python的frozenset:一种不可变的集合类型

Python的frozenset&#xff1a;一种不可变的集合类型 在Python中&#xff0c;集合是一种基本的数据类型。它们是无序的、可变的、且不允许重复的元素。但是&#xff0c;有时候我们需要一个不可变的集合&#xff0c;即一旦创建就不允许进行修改操作的集合。这就是frozenset的作…

【STM32 】芯片命名、内核、产品系列

文章目录 一、半导体公司介绍二、STM32 芯片2.1 芯片命名2.2 Cortex-M内核2.3 STM32 系列 一、半导体公司介绍 STM32是STMicroelectronics&#xff08;意法半导体&#xff09;公司的一系列32位微控制器&#xff0c;基于ARM Cortex-M内核&#xff0c;具有高性能、低功耗、丰富的…

【软件设计师暴击考点】软件工程知识高频考点【二】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件…

chatgpt赋能python:Python的Pipe:快速高效的数据传输工具

Python的Pipe&#xff1a;快速高效的数据传输工具 如果你是一名Python工程师&#xff0c;那么你一定会非常了解数据传输的重要性。Python的Pipe就是一种可以让你快速高效地传输数据的工具。在本文中&#xff0c;我们将对Python的Pipe进行详细介绍&#xff0c;探讨它的优点、如…

Linux命令(35)之shutdown

Linux命令之shutdown 1.shutdown介绍 linux命令shutdown主要用来重启、关闭服务器。 2.shutdown用法 shutdown [参数] shutdown常用参数 参数说明-c取消即将执行的关机程序-k 仅仅向每个登录用户发出警告信息&#xff0c;并不真正关机 -h关机(halt)-H关机(halt)-P关机(powe…

chatgpt赋能python:Python中的figsize:使用和优化

Python中的figsize&#xff1a;使用和优化 在数据分析和可视化领域&#xff0c;Python被广泛使用。matplotlib是一个流行的Python可视化库&#xff0c;用于创建各种类型的图形。在matplotlib中&#xff0c;figsize是一个非常有用的参数&#xff0c;可以控制图形的大小。 什么…