leetcode数据库题第六弹

这篇具有很好参考价值的文章主要介绍了leetcode数据库题第六弹。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 进行变通得到正确结果的。

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

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

leetcode数据库题第六弹文章来源地址https://www.toymoban.com/news/detail-497960.html

到了这里,关于leetcode数据库题第六弹的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 图书馆自习室|基于SSM的图书馆自习室座位预约小程序设计与实现(源码+数据库+文档)

    图书馆自习室|基于SSM的图书馆自习室座位预约小程序设计与实现(源码+数据库+文档)

    图书馆自习室 目录 基于SSM的图书馆自习室座位预约小程序设计与实现 一、前言 二、系统设计 三、系统功能设计  1、小程序端: 2、后台 四、数据库设计  五、核心代码  六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍 :✌️大厂码农|毕设布道师,

    2024年04月12日
    浏览(18)
  • 最经典的解析LSA数据库(第六课)

    最经典的解析LSA数据库(第六课)

    初步认识OSPF的大致内容(第三课)_IHOPEDREAM的博客-CSDN博客 建立领居表 同步数据库   今天来 说一说数据库概念 计算路由表 数据库是一个组织化的数据集合,用于存储、管理和检索数据。它是一个可访问的集合,旨在存储与特定主题或目的相关的数据,并提供有效的检索和使

    2024年02月09日
    浏览(9)
  • 数据库管理-第六十九期 另一种累(20230422)

    Oracle 23c的相关内容先缓缓,有些数据库管理相关的还是得正式版发布后才好去做实验。这周相较于之前那种割接较多的累还有点不一样,这周陪着客户交流了大把国产数据库厂商,每次1-2个小时,需要全神贯注,协助客户提问。 为啥要沟通的背景就不说了,这周以线上和线

    2023年04月23日
    浏览(13)
  • JAVA毕业设计132—基于Java+Springboot+Vue的自习室座位预约小程序管理系统(源代码+数据库)

    JAVA毕业设计132—基于Java+Springboot+Vue的自习室座位预约小程序管理系统(源代码+数据库)

    毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 本项目前后端分离带小程序,分为管理员、用户两种角色 1、用户: 注册、登录、自习室介绍、推荐图书、校园资讯、座位查询、座位预约、预约查看、个人信息 2、管理员: 用户管理、场地管理、座位管理、预

    2024年04月13日
    浏览(11)
  • 数据库原理第六章课后题答案(第四版)

    数据库原理第六章课后题答案(第四版)

    一、选择题 1. B    2. C    3. C    4. A    5. C 6. B    7. C    8. B    9. D    10. C 11. D   12. B   13. B   14. D   15. B 16. B   17. C 二、填空题 数据库的结构设计、数据库的行为设计 新奥尔良法 分析和设计阶段、实现和运行阶段 需求分析 概念结构设计 自顶向下、自底向

    2024年02月01日
    浏览(8)
  • 数据库系统概述——第六章 关系数据理论(知识点复习+练习题)

    数据库系统概述——第六章 关系数据理论(知识点复习+练习题)

    🌟 博主: 命运之光 🦄 专栏: 离散数学考前复习(知识点+题) 🍓 专栏: 概率论期末速成(一套卷) 🐳 专栏: 数字电路考前复习 🦚 专栏: 数据库系统概述 ☀️ 博主的其他文章: 点击进入博主的主页​​​​​ 前言: 身为大学生考前复习一定十分痛苦,你有没有过

    2024年02月09日
    浏览(15)
  • 山东专升本计算机第六章-数据库技术

    山东专升本计算机第六章-数据库技术

    数据库技术 SQL数据库与NOSQL数据库的区别 数据库管理系统 考点 6 数据库管理系统的组成和功能 组成 • 模式翻译 • 应用程序的翻译 • 交互式查询 • 数据的组织和存取 • 事务运行管理 • 数据库的维护 功能 • 数据定义功能 • 数据存取功能 • 数据库运行管理能力 • 数

    2024年02月05日
    浏览(14)
  • MySQl数据库第六课-------SQl命令的延续------快来看看

    MySQl数据库第六课-------SQl命令的延续------快来看看

     欢迎小可爱们前来借鉴我的gtiee秦老大大 (qin-laoda) - Gitee.com ———————————————————————————————— SQl语句          数据库操作          数据表操作 SQL增删 ———————————————————————————— 1.主键唯一

    2024年02月16日
    浏览(8)
  • c++之旅——第六弹

    c++之旅——第六弹

    大家好啊,这里是c++之旅第六弹,跟随我的步伐来开始这一篇的学习吧! 如果有知识性错误,欢迎各位指正!!一起加油!! 创作不易,希望大家多多支持哦! 一,静态成员: 1.静态成员是什么: 静态成员可以在类的所有对象之间共享数据,也可以提供不依赖于类的对象的

    2024年03月18日
    浏览(6)
  • 力扣刷MySQL-第六弹(详细讲解)

    力扣刷MySQL-第六弹(详细讲解)

     🎉欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹 ✨博客主页: 小小恶斯法克的博客 🎈该系列文章专栏: 力扣刷题讲解-MySQL 🍹文章作者技术和水平很有限,如果文中出现错误,希望大家能指正🙏 📜 感谢大家的关注! ❤️ 目录  🚀大的

    2024年01月20日
    浏览(7)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包