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.mzph.cn/diannao/337.shtml

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

相关文章

【双指针】

目录 1. LeetCode 283. 移动零 1.1 题目描述 1.2 题目思路 1.3 实现代码 2. LeetCode 1089. 复写零 2.1 题目描述 2.2 题目思路 2.3 实现代码 3. LeetCode 202. 快乐数 3.1 题目描述 3.2 题目思路 3.3 实现代码 4. LeetCode 11. 盛水最多的容器 4.1 题目描述 …

Debian12 中重新安装MSSQL 并指定服务器、数据库、数据表字段的字符排序规则和默认语言等参数

在 Linux 上配置 SQL Server 设置 - SQL Server | Microsoft Learn 零、查看sql server 服务器支持的字符排序规则 SELECT Name from sys.fn_helpcollations() where name Like Chinese% go------ Chinese_PRC_CI_AI Chinese_PRC_CI_AI_WS Chinese_PRC_CI_AI_KS Chinese_PRC_…

CV 面试指南—深度学习知识点总结(3)

本期专栏文章: CV 面试指南—深度学习知识点总结(1)CV 面试指南—深度学习知识点总结(2)CV 面试指南—深度学习知识点总结(3)CV 面试指南—深度学习知识点总结(4)CV 面试指南—深度学习知识点总结(5)

FPGA中闪灯程序设计示例

在FPGA设计中&#xff0c;闪灯的作用主要是用于测试和验证设计的功能和性能。具体来说&#xff0c;闪灯可以作为一个可视化的指示器&#xff0c;通过控制LED灯的闪烁模式和频率&#xff0c;来显示FPGA的工作状态或调试信息。 例如&#xff0c;在设计过程中&#xff0c;可以编写…

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

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

vue3 emits: [‘update:modelValue‘]

在 Vue.js 中&#xff0c;emits 选项用于声明组件可以触发的事件。[update:modelValue] 是 Vue 3 中用于自定义组件与 v-model 指令配合工作的特殊事件名。 当您使用 v-model 指令与自定义组件进行双向绑定时&#xff0c;Vue 内部实际上是在做以下操作&#xff1a; 将 value …

手动给docusaurus添加一个搜索

新版博客用docusaurus重构已经有些日子了&#xff0c;根据docusaurus的文档上也申请了Algolia,想一劳永逸的解决博客的搜索问题。但是流水有意&#xff0c;落花无情。 algolia总是不给我回复&#xff0c;我只能对着algolia的申请页面仰天长叹。 正常情况的申请 按照docusaur…

map基础知识

map 1.map 的定义和常用函数 1&#xff09;map 的定义 map 是一种关联容器&#xff0c;用于储存一组键值对<key-value pairs>&#xff0c;其中每个键都是唯一的&#xff1b; map 根据键的大小来自动排序&#xff0c;即 less<Key>&#xff0c;并且一般不会改变此…

函数调用栈Function Call Stack与递归

函数调用栈&#xff08;Function Call Stack&#xff09;是计算机内存中用于跟踪函数调用和返回的一种数据结构。在程序执行期间&#xff0c;每当一个函数被调用时&#xff0c;相关的信息&#xff08;例如函数参数、局部变量和返回地址&#xff09;都会被存储在栈内存中。当函数…

(十一)PostgreSQL的wal日志(2)-默认wal日志大小

PostgreSQL的wal日志(2)-默认wal日志大小 PostgreSQL的WAL&#xff08;Write-Ahead Logging&#xff09;日志文件默认大小为16MB是基于对性能和可靠性权衡的结果。这个默认值是在PostgreSQL早期版本中设定的&#xff0c;目的是在维持良好的系统性能和提高数据恢复能力之间找到…

Gitlab: Python项目CI/CD实践

目录 1. 说明 2. 准备工作 2.1 服务器 2.2 开发机hosts文件 2.3 项目 3. 步骤过程 3.1 建仓Fastapi T1 3.2 开发机测试构建与推送 ​编辑 3.3 在工作站添加gitlab-runner 3.4 提交代码&#xff0c;查看Pipelines结果 3.5 观察部署情况 4. 参考 1. 说明 分别以一个…

【2024 SCI一区】 基于DCS-BiLSTM-Attention的多元回归预测(Matlab实现)

【2024 SCI一区】 基于DCS-BiLSTM-Attention的多元回归预测&#xff08;Matlab实现&#xff09; 目录 【2024 SCI一区】 基于DCS-BiLSTM-Attention的多元回归预测&#xff08;Matlab实现&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 差异创意搜索算法&…

C++ 静态成员函数(二)

一、访问静态成员变量 静态成员函数可以通过作用域运算符::来访问类的静态成员变量和静态成员函数 静态成员函数不属于任何特定的对象&#xff0c;而是属于整个类&#xff0c;可以通过类名直接调用&#xff0c;无需创建类的实例。静态成员函数不能访问类的非静态成员变量和非…

设计模式学习笔记 - 开源实战一(下):通过剖析JDK源码学习灵活应用设计模式

概述 上篇文章我们讲解了工厂模式、建造者模式、适配器模式适配器模式在 JDK 中的应用&#xff0c;其中 Calendar 类用到了工厂模式和建造者模式&#xff0c; Collections 类用到了装饰器模式和适配器模式。学习的重点是让你了解&#xff0c;在真实的项目中模式的实现和应用更…

在 Linux 终端中创建目录

目录 ⛳️推荐 前言 在 Linux 中创建一个新目录 创建多个新目录 创建多个嵌套的子目录 测试你的知识 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 前言 在本系列的这一部…

Maven的dependencyManagement与dependencies区别

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

npm内部机制与核心原理

npm 的核心目标&#xff1a; Bring the best of open source to you, your team and your company. npm 最重要的任务是安装和维护开源库。 npm 安装机制与背后思想 npm 的安装机制非常值得探究。Ruby 的 Gem&#xff0c;Python的pip都是全局安装机制&#xff0c;但是npm的安装…

界面组件Telerik UI for WPF 2024 Q1新版亮点 - 全新DateRangePicker组件

Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序&#xff0c;同时还能快速构建企业级办公WPF应用程序。UI for WPF支持MVVM、触摸等&#xff0c;创建的应用程序可靠且结构良好&#xff0c;非常容易维护&#xff0c;其直观的API将无缝地集成Visual Studio…

spring事务处理

spring事务 事务介绍 一个事务要么同时成功&#xff0c;要么同时失败 特性 Atomic原子性 事务是由一个或多个活动组成的一个工作单元。原子性确保事务中的所有操作全部发生或全部不发生 Consistent一致性 一旦事务完成&#xff0c;系统必须确保它所建模的业务处于一致的状态 Is…

Hive进阶Day06

目录 一、MapReduce的计算过程 二、Yarn的资源调度 1、yarn的资源调度策略 三、Hive的语法树 四、数据开发 五、数据仓库 六、数据仓库开发流程 七、数仓分层 八、ETL和ELT 一、MapReduce的计算过程 分布式计算框架 需要编写代码执行&#xff0c;执行时会数据所在服务器…