leetcode数据库题第五弹

news2024/11/28 3:41:42

leetcode数据库题第五弹

  • 1141. 查询近30天活跃用户数
  • 1148. 文章浏览 I
  • 1158. 市场分析 I
  • 1164. 指定日期的产品价格
  • 1174. 即时食物配送 II
  • 1179. 重新格式化部门表
  • 1193. 每月交易 I
  • 1204. 最后一个能进入电梯的人
  • 1211. 查询结果的质量和占比
  • 1251. 平均售价
  • 小结

1141. 查询近30天活跃用户数

https://leetcode.cn/problems/user-activity-for-the-past-30-days-i/

简单题目,统计每天活跃的用户,有的用户会跨天,则两天都算活跃用户,也就是忽略状态,有操作就算。

# oracle 因为日期不包含时间,所以 oracle 还要转一下数据类型
select to_char(activity_date,'YYYY-mm-DD') day,count(distinct user_id) active_users 
from activity 
where activity_date between '2019-6-28' and '2019-7-27'
group by activity_date
# mssql && mysql
select activity_date day,count(distinct user_id) active_users 
from activity 
where activity_date between '2019-6-28' and '2019-7-27'
group by activity_date

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

1148. 文章浏览 I

https://leetcode.cn/problems/article-views-i/

嗯。。。。。排重 distinct ?注意输出信息有要求排序。

select distinct author_id id
from views
where author_id=viewer_id
order by author_id

1158. 市场分析 I

https://leetcode.cn/problems/market-analysis-i/

类型转换函数,日期函数要熟练掌握。因为要列出订单数为0的用户,所以应该先统计后关联。然后为空的数据,就要用到各自的 nvl、isnull、ifnull 了,注意不同数据库有不同的函数和用法。

#oracle
select u.user_id buyer_id,to_char(join_date,'YYYY-mm-DD') join_date,nvl(orders_in_2019,0) orders_in_2019
from users u
left join (
    select buyer_id,count(order_id) orders_in_2019
    from orders
    where order_date>='2019-01-01' and order_date<'2020-01-01'
    group by buyer_id
) c on u.user_id=c.buyer_id
# mssql
select u.user_id buyer_id,join_date,isnull(orders_in_2019,0) orders_in_2019
from users u
left join (
    select buyer_id,count(order_id) orders_in_2019
    from orders
    where order_date>='2019-01-01' and order_date<'2020-01-01'
    group by buyer_id
) c on u.user_id=c.buyer_id
# mysql
select u.user_id buyer_id,join_date,ifnull(orders_in_2019,0) orders_in_2019
from users u
left join (
    select buyer_id,count(order_id) orders_in_2019
    from orders
    where order_date>='2019-01-01' and order_date<'2020-01-01'
    group by buyer_id
) c on u.user_id=c.buyer_id

1164. 指定日期的产品价格

https://leetcode.cn/problems/product-price-at-a-given-date/

用两个子查询即可,一个取得所有产品 id ,并给出默认价格,另一个获取截止日期前最后一次更新的价格,如果没有更新的,就按默认价格,否则按更新价格列出。

# mysql
select a.product_id,ifnull(b.new_price,a.price) price 
from (
    select distinct product_id,10 price
    from products
) a
left join (
    select * from (
        select *,row_number() over(partition by product_id order by change_date desc) rid 
        from products
        where change_date<='2019-08-16'
    ) x
    where rid=1
) b on a.product_id=b.product_id
# mssql
select a.product_id,isnull(b.new_price,a.price) price 
from (
    select distinct product_id,10 price
    from products
) a
left join (
    select * from (
        select *,row_number() over(partition by product_id order by change_date desc) rid 
        from products
        where change_date<='2019-08-16'
    ) x
    where rid=1
) b on a.product_id=b.product_id
# oracle 
select a.product_id,nvl(b.new_price,a.price) price 
from (
    select distinct product_id,10 as price
    from products
) a
left join (
    select * from (
        select p.*,row_number() over(partition by product_id order by change_date desc) rid 
        from products p
        where change_date<='2019-08-16'
    ) x
    where x.rid=1
) b on a.product_id=b.product_id

1174. 即时食物配送 II

https://leetcode.cn/problems/immediate-food-delivery-ii/

额。。。sum 聚合函数立大功。因为 mssql 需要整型除整型,最后还会得到整型,所以,中间懒得转类型,直接乘一个浮点型就当转类型了。

# oracle && mysql
select round(sum(case when order_date=customer_pref_delivery_date then 1 else 0 end) / count(0) * 100,2) immediate_percentage
from (
    select d.*,row_number() over(partition by customer_id order by order_date) rid 
    from delivery d
) a
where rid=1
# mssql
select convert(decimal(5,2),sum(case when order_date=customer_pref_delivery_date then 1 else 0 end) * 1.0 / count(0) * 100) immediate_percentage
from (
    select d.*,row_number() over(partition by customer_id order by order_date) rid 
    from delivery d
) a
where rid=1

1179. 重新格式化部门表

https://leetcode.cn/problems/reformat-department-table/

哦吼,一个经典行转列的需求。

# 经典行转列,一拖三
select id,max(case when month='Jan' then revenue else null end) Jan_Revenue
    ,max(case when month='Feb' then revenue else null end) Feb_Revenue
    ,max(case when month='Mar' then revenue else null end) Mar_Revenue
    ,max(case when month='Apr' then revenue else null end) Apr_Revenue
    ,max(case when month='May' then revenue else null end) May_Revenue
    ,max(case when month='Jun' then revenue else null end) Jun_Revenue
    ,max(case when month='Jul' then revenue else null end) Jul_Revenue
    ,max(case when month='Aug' then revenue else null end) Aug_Revenue
    ,max(case when month='Sep' then revenue else null end) Sep_Revenue
    ,max(case when month='Oct' then revenue else null end) Oct_Revenue
    ,max(case when month='Nov' then revenue else null end) Nov_Revenue
    ,max(case when month='Dec' then revenue else null end) Dec_Revenue
from department
group by id
# mssql 特有行转列
select id,Jan Jan_Revenue,Feb Feb_Revenue,Mar Mar_Revenue,Apr Apr_Revenue,May May_Revenue,Jun Jun_Revenue,Jul Jul_Revenue,Aug Aug_Revenue,Sep Sep_Revenue,Oct Oct_Revenue,Nov Nov_Revenue,Dec  Dec_Revenue
from department d
pivot(max(revenue) for month in (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec)) p

1193. 每月交易 I

https://leetcode.cn/problems/monthly-transactions-i/

嗯。。。。日期转字符串并截取,然后聚合加 case when 。

# mssql
select convert(varchar(7),trans_date,126) month,country,count(0) trans_count
    ,sum(case when state='approved' then 1 else 0 end) approved_count
    ,sum(amount) trans_total_amount,sum(case when state='approved' then amount else 0 end) approved_total_amount
from transactions
group by convert(varchar(7),trans_date,126),country
# oracle
select to_char(trans_date,'YYYY-mm') month,country,count(0) trans_count
    ,sum(case when state='approved' then 1 else 0 end) approved_count
    ,sum(amount) trans_total_amount,sum(case when state='approved' then amount else 0 end) approved_total_amount
from transactions
group by to_char(trans_date,'YYYY-mm'),country
# mysql
select DATE_FORMAT(trans_date,'%Y-%m') month,country,count(0) trans_count
    ,sum(case when state='approved' then 1 else 0 end) approved_count
    ,sum(amount) trans_total_amount,sum(case when state='approved' then amount else 0 end) approved_total_amount
from transactions
group by DATE_FORMAT(trans_date,'%Y-%m'),country

然后,测试了一下,可以建立索引,下次碰到有超时风险的情况,就用索引来优化一下好了。

#mssql
if not exists(select * from sysindexes where name='NonClusteredIndex-20230619-125842')
	begin
        CREATE NONCLUSTERED INDEX [NonClusteredIndex-20230619-125842] ON transactions
        (
            id ASC
        )
        INCLUDE ( country,	trans_date) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);


	end
select convert(varchar(7),trans_date,126) month,country,count(0) trans_count
    ,sum(case when state='approved' then 1 else 0 end) approved_count
    ,sum(amount) trans_total_amount,sum(case when state='approved' then amount else 0 end) approved_total_amount
from transactions
group by convert(varchar(7),trans_date,126),country

1204. 最后一个能进入电梯的人

https://leetcode.cn/problems/last-person-to-fit-in-the-bus/

额,刚分享过的知识点,聚合函数也可以和开窗函数一起使用,嘿嘿。

由于 oracle 的 order 不能直接影响当前 rownum,所以还要套一层,真麻烦

# mssql
select top 1 person_name 
from (
    select *,sum(weight) over(order by turn) w 
    from queue
) a
where w<=1000
order by w desc
# mysql
select person_name 
from (
    select *,sum(weight) over(order by turn) w 
    from queue
) a
where w<=1000
order by w desc
limit 0,1
# oracle
select * from (
	select person_name 
	from (
	    select q.*,sum(weight) over(order by turn) w 
	    from queue q
	) a
	where w<=1000
	order by w desc
) a
where rownum=1

1211. 查询结果的质量和占比

https://leetcode.cn/problems/queries-quality-and-percentage/

嗯。。。计算后的结果求平均,以及部分符合条件的数据求汇总,sum 和 case 组合永远好用。额。。。注意百分比那个需要乘100。

# oracle && mysql
select query_name,round(avg(rating * 1.0 / position),2) quality
    ,round(sum(case when rating < 3 then 1.0 else 0 end) / count(0) * 100,2) poor_query_percentage
from queries
group by query_name
# mssql
select query_name,convert(decimal(5,2),avg(rating * 1.0 / position)) quality
    ,convert(decimal(5,2),sum(case when rating < 3 then 1.0 else 0 end) / count(0) * 100) poor_query_percentage
from queries
group by query_name

1251. 平均售价

https://leetcode.cn/problems/average-selling-price/

临到本期结束,又一个简单题目,直接聚合比聚合即可。

# mssql
select u.product_id,convert(decimal(8,2),sum(u.units * 1.0 * p.price) / sum(u.units)) average_price 
from unitssold u
left join prices p on u.purchase_date between p.start_date and p.end_date and u.product_id=p.product_id
group by u.product_id
# mysql && oracle
select u.product_id,round(sum(u.units * 1.0 * p.price) / sum(u.units),2) average_price 
from unitssold u
left join prices p on u.purchase_date between p.start_date and p.end_date and u.product_id=p.product_id
group by u.product_id

小结

本次题目,多余集中到了开窗函数和分组上,结合各种子查询,很容易得到结果。

注意审题,输出信息有时会有要求。注意子查询关联优先级,包含空值时,注意关联方式即可。

行转列文章,可以参考老顾之前的:【新星计划】数据库行列转换初识

聚合函数和开窗函数,可以参考老顾之前的:【新星计划】数据库 排名函数 初识

在这里插入图片描述
可惜的是老顾没有力扣会员,也不明白,这些所谓的困难题目为什么要会员才能刷,真想进去玩玩看啊。

在这里插入图片描述

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

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

相关文章

chatgpt赋能python:Python打开文件目录:入门指南

Python打开文件目录&#xff1a;入门指南 打开文件目录是编程中常见的操作之一。Python 作为一种优秀的脚本语言&#xff0c;提供了众多的实用方法来操作文件系统。在本文中&#xff0c;我们将介绍如何使用 Python 打开文件目录&#xff0c;同时提供一些对 SEO 优化有帮助的技…

NodeJS 生成APIDOC⑩①

文章目录 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f618;前言API 文档生成工具 APIDOC特点 APIDOC使用步骤0、 运行命令1、 安装插件3、 配置演示4、 ApidocJson配置文件5、效果图 总结 ✨文章有误请指正&#x…

Storm forming 风雨欲来 | 经济学人20230325版社论高质量双语精翻

本期精翻为2023年3月25日《经济学人》周报封面文章&#xff1a;《风雨欲来》&#xff08;Storm forming&#xff09;。 Storm forming 风雨欲来 As video games grow, they are eating the media 随着电子游戏的发展&#xff0c;它们正在蚕食媒体 The games business has lesso…

计算机网络概论

计算机网络概论 组成 客户端&#xff1a;就像蟹堡王的顾客一样。服务端&#xff1a;类似于蟹堡王的分店。路由器&#xff1a;扮演着转发分店的角色。网络协议&#xff1a;像转发表格一样帮助数据在网络中传输。 计算机网络基础 网络组成部分 主机&#xff1a;客户端和服务端…

AVL树原理以及插入代码讲解(插入操作画图~细节)

原理 AVL 树是一种平衡搜索二叉树&#xff0c;得名于其发明者的名字&#xff08; Adelson-Velskii 以及 Landis&#xff09;。&#xff08;可见名字长的好处&#xff0c;命名都能多占一个字母出来&#xff09;。在搜索树的前提下平衡搜索二叉树还定义如下&#xff1a; 左右子…

JVM知识点梳理

什么是JVM&#xff1f; JVM是java虚拟机的缩写 &#xff0c;也是java程式可以实现跨平台的关键。 JVM部分需要知道什么东西&#xff1f; JVM的结构和功能、参数配置、GC回收机制、GC回收器极其优缺点。 JVM结构&#xff08;栈&#xff0c;程序计数器&#xff0c;方法区&#xf…

0009-TIPS-SLAB入门与观察

极简&#xff0c;但是能快速上手 slub算法 这篇文章简洁直观&#xff0c;推荐 linux 内核 内存管理 slub算法 &#xff08;一&#xff09; 原理 感受slub堆漏洞 需要下载 https://github.com/De4dCr0w/green-dill &#xff0c;使用其中的测试程序做实验 UAF 如果看完上面链…

F407/103启动文件and启动过程

STM32 启动文件简介 STM32 启动文件由 ST 官方提供&#xff0c;在官方的固件包里。 startup_stm32f40_41xxx.s 启动文件由汇编编写&#xff0c;是系统上电复位后第一个执行的程序。 启动文件主要做了以下工作&#xff1a; 1 、初始化堆栈指针 SP _initial_sp 2 、初始…

SSM面试题

文章目录 一、Spring1.1 配置一个bean的方式?注解/xml1.2 spring 自动装配 bean 有哪些方式?1.3 spring 常用的注入方式有哪些?1.4 Component和Bean的区别?1.5 spring 事务实现方式有哪些?1.6 spring事务的传播机制?1.7 spring 的事务隔离? 二、SpringMVC2.1 SpringlIvc…

阿里云在国内市场占有率怎么样?

阿里云在国内市场占有率怎么样&#xff1f;   阿里云在国内市场占有率分析   随着互联网的飞速发展&#xff0c;越来越多的企业和个人开始利用云计算服务来满足各种业务需求。作为中国领先的云服务提供商&#xff0c;阿里云自成立以来就受到了广泛关注。本文旨在分析阿里云…

cmake入门(2)

cmake 教程2 demo cmake_minimum_required(VERSION 3.10) project(Tutorial)set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True)add_executable(Tutorial tutorial.cxx)基础 cmake_minimum_required cmake的版本要求 project 项目的名字&#xff0c;同时会生…

ad18学习笔记五:统计焊盘数量(board information)

AD18之后&#xff0c;Altium Designer改动比较大。下面将介绍AD19如何统计焊盘(PAD数量)与SMT贴片数量与插件数量 1&#xff1a; PCB 空白处 -> F11 -> Properties 选项卡 -> Board Information -> Pads 2&#xff1a; Pads 包括 通孔焊盘和贴片焊盘 Vias 包括过孔…

22.小波神经网络时间序列预测交通流量(附matlab程序)

1.简述 学习目标&#xff1a;小波神经网络时间序列预测交通流量 WNN&#xff08;小波神经网络&#xff09;&#xff1a;是在误差反传神经网络拓扑结构的基础上发展而来的网络&#xff0c;与神经网络的结构具有一定的相似&#xff0e;在小波神经网络中&#xff0c;当整体信号…

第十三章 csv模块

1. csv模块介绍 介绍csv 模块前&#xff0c;需要先了解csv 文件&#xff08;.csv 文件格式&#xff09;&#xff0c;csv 文件中的每行代表电子表格中的一行&#xff0c;并用逗号分隔该行中的单元格。 csv 文件可以使用记事本打开&#xff0c;可以使用Excel 另存为.csv 文件格…

docker内访问tdengine服务

踩坑记 springboot项目使用docker部署。由于tdengine原生连接方式需要安装客户端&#xff0c;第一想法是宿主机装好客户端&#xff0c;然后映射驱动到容器内部&#xff0c;网上找的教程也基本是这种思路。尝试了一天失败了。 错误1:libjemalloc.so.2 file: No such file or d…

docker安装下载tomcat一站式搞定并设置挂载卷

阿丹&#xff1a; 之前在使用nginx部署搭建vue项目的时候没有出docker配置nginx的配置文档&#xff08;因为之前使用的是腾讯云现成的nginx服务器&#xff09;&#xff0c;今天配置安装一下tomcat和nginx在docker里面的安装。 在docker中安装配置tomcat 操作解读&#xff1a;…

服务器中间件

文章目录 一、tomcat二、 nginx2.1 代理问题2.2 负载均衡问题2.3 资源优化2.4 Nginx处理2.5 Nginx的特点&#xff1a;2.6 Nginx的安装2.7 Nginx的配置文件2.8 Nginx的反向代理2.9 反向代理&#xff1a;2.10 基于Nginx实现反向代理2.11 关于Nginx的location路径映射2.12 负载均衡…

【实战项目】利用mmdetection识别卫星遥感影像上的电线杆塔

前言 这次项目算是对openmmlab AI实战营第二期的一个实验证明&#xff0c;虽然这几天学习的比较粗糙&#xff0c;但也算是入门了mmdetection。 这个工具就像python一样&#xff0c;openmmlab已经将入门门槛做的很低了&#xff0c;但如果想精进、熟练甚至做真正的调参侠&#xf…

小白到运维工程师自学之路 第三十九集 (LVS架构)

一、概述 1、lvs LVS是Linux Virtual Server的缩写&#xff0c;是一种基于Linux内核的高性能、高可用性的 负载均衡软件。它可以将多台服务器组成一个虚拟的服务器集群&#xff0c;通过负载均衡算法将 客户端请求分发到不同的服务器上&#xff0c;从而提高系统的可用性和性能…

【MQTT 5.0】协议 ——发布订阅模式、Qos、keepalive、连接认证、消息结构

一、前言1.1 MQTT 协议概述1.2 MQTT规范 二、MQTT 协议基本概念2.1 发布/订阅模式2.11 MQTT 发布/订阅模式2.12 MQTT 发布/订阅中的消息路由2.13 MQTT 与 HTTP 对比2.14 MQTT 与消息队列 2.2 服务质量&#xff1a;QoS2.21 QoS 0 最多分发一次2.22 QoS1 至少分发一次2.23 QoS 2 …