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

news2024/12/24 16:21:02

目录

相关表结构:

1、order_info表

2、order_detail表

题目及思路解析:

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

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

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

总结归纳:

知识补充:


相关表结构

1、order_info表

2、order_detail表

题目及思路解析:

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

题目需求:

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

思路解析:

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

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

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

代码实现:

select
    t1.category_id,
    category_name,
    sku_id,
    name,
    order_num,
    order_cnt
from (
    select
        category_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_cnt
    from (
         select
            sku_id,
            sum(sku_num) order_num
         from order_detail
         group by sku_id )od
    left 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,
       case
           when 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_far
         from (
                  select user_id,
                         create_date,
                         sum(total_amount) total_amount_per_day
                  from order_info
                  group by user_id, create_date
              ) t1
     ) t2;

代码解析:

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

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

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

注意:

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

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

执行结果:

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

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

题目需求:

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

思路解析:

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

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

代码实现:

select
 concat(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_second
         from (
                  select user_id,
                         create_date,
                         rank() over (partition by user_id order by create_date) rk
                  from (
                           select user_id,
                                  create_date
                           from order_info
                           group by user_id, create_date
                       ) t1
              ) t2
         where rk <= 2
         group 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.coloradmin.cn/o/1606762.html

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

相关文章

C#版Facefusion:让你的脸与世界融为一体!-02 获取人脸关键点

C#版Facefusion&#xff1a;让你的脸与世界融为一体&#xff01;-02 获取人脸关键点 目录 说明 效果 模型信息 项目 代码 下载 说明 C#版Facefusion一共有如下5个步骤&#xff1a; 1、使用yoloface_8n.onnx进行人脸检测 2、使用2dfan4.onnx获取人脸关键点 3、使用arcfa…

【MATLAB源码-第36期】matlab基于BD,SVD,ZF,MMSE,MF,SLNR预编码的MIMO系统误码率分析。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. MIMO (多输入多输出)&#xff1a;这是一个无线通信系统中使用的技术&#xff0c;其中有多个发送和接收天线。通过同时发送和接收多个数据流&#xff0c;MIMO可以增加数据速率和系统容量&#xff0c;同时提高信号的可靠性。…

算法1: 素数个数统计

统计n以内的素数个数 素数&#xff1a;只能被1和自身整除的自然数&#xff0c;0和1除外&#xff1b; 举例&#xff1a; 输入&#xff1a;100 输出&#xff1a;25 import java.util.*; class Test1{public static void main(String[] args){int a 100; //输入数字//…

41、二叉树-二叉树的层序遍历

思路&#xff1a; 层序遍历就是从左到右依次遍历。这个时候就可以使用队列的方式。例如先把头节点入队&#xff0c;然后遍历开始&#xff0c;首先计算队列长度&#xff0c;第一层&#xff0c;长度为了&#xff0c;遍历一次&#xff0c;依次出队&#xff0c;头结点出队&#xff…

Redis的RedisObject和对外可见的5种数据结构

目录 RedisObject Redis的编码方式 对外可见的5种数据结构 1.string string结构的源码 为什么是小于44字节会采用embstr编码&#xff1f; embstr和raw区别 2.list list结构的源码 3.set set结构的源码 4.zset zset结构的源码 5.hash hash结构的源码 Redis中…

淘宝客订单产品设计:连接商家与推广者的智能桥梁

随着电商行业的迅速发展&#xff0c;淘宝客作为一种常见的推广方式&#xff0c;为商家引流、提升销量发挥了重要作用。而淘宝客订单产品的设计&#xff0c;则是连接商家与推广者的智能桥梁&#xff0c;本文将对其进行探讨与分析。 ### 1. 淘宝客订单产品的定义 淘宝客订单产品…

梯度提升树(Gradient Boosting Trees)

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个梯度提升树&#xff08;Gradient Boosting Trees&#xff09;模型程序,最后打印5个条件分别的影响力。 示例一 梯…

【目标检测】Focal Loss

Focal Loss用来解决正负样本不平衡问题&#xff0c;并提升训练过程对困难样本的关注。 在一阶段目标检测算法中&#xff0c;以YOLO v3为例&#xff0c;计算置信度损失&#xff08;图中第3、4项&#xff09;时有目标的点少&#xff0c;无目标的点多&#xff0c;两者可能相差百倍…

WSL(Ubuntu)、PC物理机,linux开发板三个设备通讯,镜像模式

文章目录 一、前言二、使用2.1 需要的系统信息2.2 添加 .wslconfig 文件 三、如何从局域网访问WSL中的服务 一、前言 最近在使用Linux开发板的环境下&#xff0c;由于使用的 WSL的子系统&#xff0c;并不是虚拟机&#xff0c;导致 网络传输 这方面不是很方便&#xff0c;由于 W…

AGM AG32 MCU在汽车UWB应用方案

AG32的汽车UWB应用方案 汽车电子产品的日益成熟&#xff0c;包括ADAS和车载信息娱乐&#xff0c;正在推动对CPLD的需求。例如&#xff0c;利用安装在车上的各种传感器&#xff08;如雷达、摄像头和激光雷达等&#xff09;来感知周围环境&#xff0c;实现实时监测和数据处理。这…

docker容器技术篇:数据卷的常用操作

Docker数据卷的使用 在docker中&#xff0c;为了方便查看容器内产生的数据或者将多个容器中的数据实现共享&#xff0c;就涉及到容器数据卷管理&#xff0c;那什么是数据卷呢&#xff0c;往下看&#xff01;&#xff01;&#xff01; 1 数据卷概念 数据卷是一个共给容器使用…

一款挺不错网站维护页面HTML源码

一款挺不错网站维护页面源码&#xff0c;单HTML不需要数据库&#xff0c;上传到你的虚拟机就可以用做维护页面还不错&#xff0c;用处多。。 源码下载 一款挺不错网站维护页面源码

C# - 反射动态添加/删除Attribute特性

API: TypeDescriptor.AddAttributes TypeDescriptor.GetAttributes 注意&#xff1a;TypeDescriptor.AddAttributes添加的特性需要使用 TypeDescriptor.GetAttributes获取 根据api可以看到&#xff0c;该接口不仅可以给指定类&#xff08;Type&#xff09;添加特性&#xf…

设计模式——模版模式21

模板方法模式在超类中定义了一个事务流程的框架&#xff0c; 允许子类在不修改结构的情况下重写其中一个或者多个特定步骤。下面以ggbond的校招礼盒发放为例。 设计模式&#xff0c;一定要敲代码理解 模版抽象 /*** author ggbond* date 2024年04月18日 17:32* 发送奖品*/ p…

华为框式交换机S12700E系列配置CSS集群

搭建集群环境 a.为两台交换机上电&#xff0c;按照数据规划分别对两台框式交换机进行配置 <HUAWEI> system-view [HUAWEI] sysname Switch1 [Switch1] set css id 1 [Switch1] set css priority 150 //框1的集群优先级配置为150 [Switch1] interface css-port 1 [Sw…

后端-MySQL-week11 多表查询

tips: distinct————紧跟“select”之后&#xff0c;用于去重 多表查询 概述 一对多&#xff08;多对一&#xff09; 多对多 一对一 多表查询概述 分类 连接查询 内连接 外连接 自连接 必须起别名&#xff01; 联合查询-union&#xff0c;union all 子查询 概念 分类 …

家庭营销广告Criteo公司首次获得MRC零售媒体测量认证

家庭营销广告Criteo公司首次获得零售媒体测量MRC认证 商业媒体公司Criteo2024年3月28日宣布&#xff0c;它首次获得媒体评级委员会&#xff08;MRC&#xff09;的认证&#xff0c;在其企业零售媒体平台commerce Max和commerce Yield上&#xff0c;在桌面、移动网络和移动应用内…

Goland远程连接Linux进行项目开发

文章目录 1、Linux上安装go的环境&#xff12;、配置远程连接3、其他配置入口 跑新项目&#xff0c;有个confluent-Kafka-go的依赖在Windows上编译不通过&#xff0c;报错信息&#xff1a; undefined reference to __imp__xxx似乎是这个依赖在Windows上不支持&#xff0c;选择让…

阿里云ECS迁移至AWS EC2,九河云详细教程

在客户在求更大的海外市场&#xff0c;综合考虑后决定选择AWS云&#xff0c;但对迁移方面不太了解&#xff0c;甚至比较担心如果到AWS云是否业务要从0开始&#xff1f;本文九河云将为您介绍如何将阿里云ECS平滑迁移至AWS。 工具介绍 AWS Application Migration Service &…

pytorch-手写数字识别之全连接层实现

目录 1. 背景2. nn.Linear线性层2. 实现MLP网络3. train4. 完整代码 1. 背景 上一篇https://blog.csdn.net/wyw0000/article/details/137622977?spm1001.2014.3001.5502中实现手撸代码的方式实现了手写数字识别&#xff0c;本文将使用pytorch的API实现。 2. nn.Linear线性层…