HQL,SQL刷题,尚硅谷(中级)

目录

相关表结构:

1、order_info表

2、order_detail表

题目及思路解析:

第一题,查询各品类销售商品的种类数及销量最高的商品

第二题  查询用户的累计消费金额及VIP等级

第三题  查询首次下单后第二天连续下单的用户比率

总结归纳:

知识补充:


相关表结构

1、order_info表

2、order_detail表

题目及思路解析:

第一题,查询各品类销售商品的种类数及销量最高的商品

题目需求:

从订单明细表(order_detail)统计各品类销售出的商品种类数及累积销量最好的商品,期望结果如下:

思路解析:

这道题是典型的分组套环题(或者说是经典的分组top N)

求的是 各品类中商品累积销量最好的,”商品种类“,即在每个分类里面的商品数量

这里累积销量比较难求,逻辑上,我们先求累积量,再求商品种类数

代码实现:

selectt1.category_id,category_name,sku_id,name,order_num,order_cnt
from (selectcategory_id,si.sku_id,name,order_num,rank() over (partition by category_id order by order_num desc ) rk,count(distinct  od.sku_id) over(partition by category_id) order_cntfrom (selectsku_id,sum(sku_num) order_numfrom order_detailgroup by sku_id )odleft join sku_info si on si.sku_id=od.sku_id  )t1
left join category_info ci  on ci.category_id=t1.category_id
where rk=1;

代码解析:

具体思路:分开求解,多层嵌套

首先 第一层查询,从order_detail表中求出各个商品的销售量

接着 第二层查询,进行分组排序,先连接sku_info表,使用rank()函数降序排序

然后 使用count()函数开窗,求出商品的品类数

最后 最后一层查询,连接category_info表,并根据条件筛选出销量最高的商品

执行结果:

补充说明:

1、我们求的是在分类里面的商品数排序(根据分类id进行排序),但order_detail没有,

因此在第二步时候,应当先连接skuin_fo

2、category_info表可以在前面第二层查询时候就连接

3、这里求商品种类数,这个有两种方法,一个是开窗,另一个是子查询

注意 :这个窗口范围就是在每一个分区里面即可,因此可以不用些范围

----------------------------------------------------------------------------------------------

第二题  查询用户的累计消费金额及VIP等级

题目需求:

从订单信息表(order_info)中统计每个用户截止其每个下单日期的累积消费金额,以及每个用户在其每个下单日期的VIP等级。

用户vip等级根据累积消费金额计算,计算规则如下:

设累积消费总额为X,

若0=<X<10000,则vip等级为普通会员

若10000<=X<30000,则vip等级为青铜会员

若30000<=X<50000,则vip等级为白银会员

若50000<=X<80000,则vip为黄金会员

若80000<=X<100000,则vip等级为白金会员

若X>=100000,则vip等级为钻石会员

期望结果如下:

思路解析:

这题倒是不怎么难,根据题目需求,我们需要的是截止每个日期的累积消费金额

这里自然是用开窗函数最适合,然后需要计算金额,那么使用sum()开窗即可,之后的vip等级可以用case when

代码实现:

select user_id,create_date,sum_so_far,casewhen sum_so_far >= 100000 then '钻石会员'when sum_so_far >= 80000 then '白金会员'when sum_so_far >= 50000 then '黄金会员'when sum_so_far >= 30000 then '白银会员'when sum_so_far >= 10000 then '青铜会员'when sum_so_far >= 0 then '普通会员'end vip_level
from (select user_id,create_date,sum(total_amount_per_day) over (partition by user_id order by create_date) sum_so_farfrom (select user_id,create_date,sum(total_amount) total_amount_per_dayfrom order_infogroup by user_id, create_date) t1) t2;

代码解析:

首先 我们需要求出每个用户每天的消费总金额

之后 我们进行开窗,范围是第一行到当前行

最后 用case when 进行等级匹配划分

注意:

1、由于可能存在同一用户,同一天有多个消费订单,因此我们需要先求出每个用户每天的消费总金额,再开窗

2、开窗范围是每个用户分区,因此可以不用指定范围

执行结果:

----------------------------------------------------------------------------------------------

第三题  查询首次下单后第二天连续下单的用户比率

题目需求:

从订单信息表(order_info)中查询首次下单后第二天仍然下单的用户占所有下单用户的比例,结果保留一位小数,使用百分数显示,期望结果如下:

思路解析:

首次、第二天,意味着我们需要获取到每个用户的首次下单的日期,与第二天下单的日期

这是时候用排序开窗函数就比较合适,其实这又是一个典型的分组topN的问题,至于那个函数都可以,这里就选择rank

代码实现:

selectconcat(round(sum(if(datediff(buy_date_second, buy_date_first) = 1, 1, 0)) / count(*) * 100, 1), '%') percentage
from (select user_id,min(create_date) buy_date_first,max(create_date) buy_date_secondfrom (select user_id,create_date,rank() over (partition by user_id order by create_date) rkfrom (select user_id,create_datefrom order_infogroup by user_id, create_date) t1) t2where rk <= 2group by user_id) t3;

注意:

1、字符串连接函数:concat

语法: concat(string A, string B…)

返回值: string

说明:返回输入字符串连接后的结果,支持任意个输入字符串

hive> select concat(‘abc’,'def’,'gh’) from iteblog;abcdefgh

2、取整函数: round

语法: round(double a)

返回值: BIGINT

说明: 返回double类型的整数值部分 (遵循四舍五入)

hive> select round(3.1415926) from iteblog;
3
hive> select round(3.5) from iteblog;
4
hive> create table iteblog as select round(9542.158) from iteblog;
hive> describe iteblog;
_c0     bigint

 

代码解析:

1、首先,我们需要获取每个用户及其下单日期,注意这里需要去重,但不需要分组,因为只是简单的查询获取也没用函数

2、接着进行分组tpoN开窗操作,注意后面筛选条件,获取是排名前两名的,应取'<=2'(若'=2'取等于,取的是第二名的)

3、然后将首次与第二天(若存在)的两个日期以min()与max()方式取出(这里情况比较特殊,可以不用开窗),注意需要分组,因为需要的是每个用户的首次与第二天(若存在)的两个日期

4、最后用sum(if())判断,将数据差值为1的保持不变,而非1的置为0,否则需要先获取差值为1的,然后求和,即可获取相应条件的人数,最后除以总人数,即为比率

5、最后的最后,可以百分比形式输出显示

执行结果:


总结归纳:

 这三题主要是考察开窗函数的使用,比如sum()over()、rank()over()

第一和第三题是分组topN的问题,第二题是case when 匹配题

知识补充:

这里如果报这样的错误,原因是 你没有给子查询写别名,

记住,给每一个子查询都写上别名,才能避免出现一些问题,

如:select * from (select * from table)a

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 传输文件

scp [选项] 源文件 目标路径 以下是一些常用的 scp 命令选项&#xff1a; -r&#xff1a;递归复制目录和子目录。 -P&#xff1a;指定远程 SSH 服务器的端口号。 -i&#xff1a;指定用于身份验证的私钥文件。 -p&#xff1a;保留源文件的时间戳、权限和所有者。 -v&#x…

vivado 使用 JTAG-to-AXI Master 调试核进行硬件系统通信

使用 JTAG-to-AXI Master 调试核进行硬件系统通信 JTAG-to-AXI Master 调试核为可自定义核 &#xff0c; 可在运行时生成 AXI 传输事务并驱动 FPGA 内部的 AXI 信号。该核支持所 有存储器映射型 AXI 接口和 AXI4-Lite 接口 &#xff0c; 并且可支持位宽为 32 或 64 …

Py深度学习基础|Numpy基础总结

注&#xff1a;本文来自菜鸟教程学习总结 一、数组属性 NumPy 的数组中比较重要 ndarray 对象属性有&#xff1a; 注意&#xff1a;使用reshape后&#xff0c;数组的结构&#xff08;即元素的排列顺序和内在连接&#xff09;没有改变&#xff0c;但因为返回的是一个视图&#…

FTP客户端Transmit 5 for Mac中文激活版

Transmit 5是一款功能强大的Mac FTP客户端软件&#xff0c;它由Panic公司开发&#xff0c;为用户提供简单、高效的文件传输体验。 Transmit 5 for Mac中文激活版下载 Transmit 5支持多种传输协议&#xff0c;如FTP、SFTP、WebDAV和Amazon S3等&#xff0c;满足用户不同的文件传…

Maven的dependencyManagement与dependencies区别

先说结论&#xff1a;Maven 使用dependencyManagement 元素来提供了一种管理依赖版本号的方式。 在maven多模块项目的pom文件中&#xff0c;有的小伙伴会发现最外层的pom文件和里面的pom文件有个地方不一样 如下图 父pom 子pom 一般来说是在maven的最外父工程pom文件里&…

JAVA网络编程、项目验证码实现

什么是网络编程? 在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行的数据传输。 应用场景&#xff1a;即时通信、网游对战、金融证券、国际贸易、邮件、等等 不管是什么场景&#xff0c;都是计算机跟计算机之间通过网络进行数据传输 Java中可以使用ja…

AI大模型量化格式介绍(GPTQ,GGML,GGUF,FP16/INT8/INT4)

在 HuggingFace 上下载模型时&#xff0c;经常会看到模型的名称会带有fp16、GPTQ&#xff0c;GGML等字样&#xff0c;对不熟悉模型量化的同学来说&#xff0c;这些字样可能会让人摸不着头脑&#xff0c;我开始也是一头雾水&#xff0c;后来通过查阅资料&#xff0c;总算有了一些…

OpenHarmony网络组件-Mars

项目简介 Mars 是一个跨平台的网络组件&#xff0c;包括主要用于网络请求中的长连接&#xff0c;短连接&#xff0c;是基于 socket 层的解决方案&#xff0c;在网络调优方面有更好的可控性&#xff0c;暂不支持HTTP协议。 Mars 极大的方便了开发者的开发效率。 效果演示 编译…

SpringBoot整合消息中间件(ActiveMQ,RabbitMQ,RocketMQ,Kafka)

消息中间件 消息消息队列JMS AMQPMQTTKafka Spring整合消息队列模拟消息队列的工作流程Spring整合ActiveMQSpring整合RabbitMQ直连交换机模式主题交换机模式 Spring整合RocketMQSpring整合kafka 消息 消息的发送方&#xff1a;生产者 消息的接收方&#xff1a;消费者 同步消息…

LangChain入门:18.使用ReAct 框架进行生成推理痕迹和任务特定行动来实现更大的协同作用

在这篇技术博文中&#xff0c;我们将深入探讨LangChain框架中的ReAct对话模型&#xff0c;以及如何利用它构建高效的智能对话系统。ReAct模型通过反应堆&#xff08;Reactor&#xff09;处理对话中的各种情况&#xff0c;实现了对复杂对话场景的有效解构。结合思维链&#xff0…

Ubuntu 微调训练ChatGLM3大语言模型

Ubuntu 微调训练ChatGLM3大语言模型 LLaMA Factory 的 LoRA 微调提供了 3.7 倍的加速比&#xff0c;同时在广告文案生成任务上取得了更高的 Rouge 分数。结合 4 比特量化技术&#xff0c;LLaMA Factory 的 QLoRA 微调进一步降低了 GPU 显存消耗。 https://github.com/hiyouga…

政安晨:【Keras机器学习示例演绎】(二)—— 使用 DeepLabV3+ 进行多类语义分割

目录 简介 下载数据 创建 TensorFlow 数据集 构建 DeepLabV3 模型 训练 利用色图叠加进行推理 对验证图像进行推理 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益…