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

目录

相关表结构:

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.mfbz.cn/a/556208.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024.4.18

学生管理部分 #include<myhead.h> int main(int argc, char *argv[]) {sqlite3* ppDbNULL;if(sqlite3_open("./mydb.db",&ppDb)!SQLITE_OK){printf("sqlite3_open error:%s\n",sqlite3_errmsg(ppDb));return -1;}//创建数据表char arg[128]&quo…

SQL Serve---嵌套查询

定义 嵌套查询&#xff1a;主要用于复杂的查询中。在SQL语言中&#xff0c;一个Select From Where语句称为一个查询块&#xff0c;将一个查询块嵌套在另一个查询的Where子句或Having短语中的查询称为嵌套查询。 子查询的类型 使用别名的子查询 使用IN和NOT IN的子查询 使用比较…

4.15报错记录

打开文件时出错a bytes-like object is required,notNoneType 确保E:/data/stdata/st- images-1208-json|ST-WT-1.json是一个有效的标签文件。 今天用X-anylabling更改标签目录时出现这个报错 解决方案&#xff1a;图片文件夹中创建同名的一个文件夹把json文件放进去就可以打…

Ubuntu 微调训练ChatGLM3大语言模型

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

六边形酷科技特效单页源码

源码介绍 基于canvas画布绘制多个六边形追踪鼠标&#xff0c;科技感的几何图形酷炫动画特效&#xff0c; 单页html源码&#xff0c;可以做网站动态背景&#xff0c;喜欢的朋友可以拿去 效果截图 完整源码 <!doctype html> <html> <head> <meta charset…

OpenHarmony UI开发-ohos-svg

简介 ohos-svg是一个SVG图片的解析器和渲染器&#xff0c;解析SVG图片并渲染到页面上。它支持大部分 SVG 1.1 规范&#xff0c;包括基本形状、路径、文本、样式和渐变,它能够渲染大多数标准的 SVG 图像。ohos-svg的优点是性能好、内存占用低。 效果展示 SVG图片解析并绘制: …

C++ | Leetcode C++题解之第35题搜索插入位置

题目&#xff1a; 题解&#xff1a; class Solution { public:int searchInsert(vector<int>& nums, int target) {int n nums.size();int left 0, right n - 1, ans n;while (left < right) {int mid ((right - left) >> 1) left;if (target < n…

单页面首屏优化,打包后大小减少64M,加载速度快了13.6秒

需求背景 从第三方采购的vue2 ElementUI实现的云管平台&#xff0c;乙方说2011年左右就开始有这个项目了&#xff08;那时候有Vue了吗&#xff0c;思考.jpg&#xff09;。十几年的项目&#xff0c;我何德何能可以担此责任。里面的代码经过多人多年迭代可以用惨不忍睹来形容&a…

面试题:Java中int符号数字的位运算与操作 + 原码、反码、补码之间如何进行转换

题目来源 阿里-淘天-技术1面 问题 -1和4做位运算与操作&#xff0c;结果是多少&#xff1f; 答案 正确答案 4 通过Java代码验证如下&#xff1a; 我的回答 -5&#xff0c;但是-5是错误的答案。 面试的时候&#xff0c;面试官没有告诉我对错。 为什么&#xff1f; 到底…

[生活][杂项] 上班党的注意事项

前言 目前是上班已经接近两年了&#xff0c;目前的状态是&#xff0c;一个人租了一个单间在上班。对于这种情况有以下几点需要注意。 钥匙问题&#xff0c;一定不要陷入钥匙丢失的情况&#xff01;一定不要陷入钥匙丢失的情况&#xff01;一定不要陷入钥匙丢失的情况&#xff…

CSS:filter(滤镜)属性

用途 可以用于img标签&#xff0c;div标签等 图像&#xff0c;背景&#xff0c;边框的调整 常用属性 1. 灰度 grayscale()&#xff0c;默认是0&#xff0c;100%就是黑白 2. blux 给图像设置高斯模糊的程度&#xff0c;radius值设定高斯模糊的程序&#xff0c;表示像素点…

2024年Q1季度冰箱行业线上市场销售数据分析

Q1季度冰箱线上市场表现不如预期。 根据鲸参谋数据显示&#xff0c;2024年1月至3月线上电商平台&#xff08;京东天猫淘宝&#xff09;冰箱累计销量约410万件&#xff0c;环比下降11%&#xff0c;同比下降21%&#xff1b;累计销售额约98亿元&#xff0c;环比下降31%&#xff0…

python爬虫(Selenium案列)第二十四

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

详细分析Python的继承和多态(附Demo)

目录 前言1. 继承2. 多态 前言 入行多年&#xff0c;对于知识点还会混淆&#xff0c;此处主要做一个详细区分 继承&#xff08;Inheritance&#xff09;: 面向对象编程中的一个重要概念&#xff0c;允许一个类&#xff08;称为子类或派生类&#xff09;继承另一个类&#xff…

工作流JBPM操作API启动实例查询任务

文章目录 8.5 启动实例8.5.1 按照key启动(不加参数)8.5.2 按照key启动(加入参数)8.5.3 启动流程实例的说明 8.6 查询任务8.6.1 查询所有未办理任务8.6.2 查询个人未办理任务8.6.3 查询个人的待办组任务 8.5 启动实例 8.5.1 按照key启动(不加参数) Test // 启动 -- 简单的启…

2024华中杯B题完整思路代码论文解析

2024华中杯B题思路论文汇总 https://www.yuque.com/u42168770/qv6z0d/xpkf6ax8udqq9lt2?singleDoc# 本文针对电子地图服务商利用车辆轨迹数据估计城市路口信号灯周期的问题,提出了一系列数学模型和算法。通过分析车辆行驶轨迹与信号灯的关联性,在不同的约束条件下,实现了对路…

谷歌量化白皮书—PTQ原理

本篇笔记摘抄的原文链接 量化方法 量化粒度 量化模拟 激活层的量化 量化硬件原理 量化范围的设置方法 基于BN的激活层量化范围设置 普通卷积 VS 深度可分离卷积 跨层均衡化 ReLU6比ReLU有什么优势 吸收高偏差、偏差校正、自适应取整 标准PTQ流程 量化模型精度的诊断和性能…

综合大实验

题目&#xff1a; 1、R4为ISP&#xff0c;其上只配置IP地址&#xff1b;R4与其他所直连设备间均使用公有IP&#xff1b; 2、R3-R5、R6、R7为MGRE环境&#xff0c;R3为中心站点&#xff1b; 3、整个OSPF环境IP基于172.16.0.0/16划分&#xff1b;除了R12有两个环回&#xff0c;其…

LeetCode in Python 1338. Reduce Array Size to The Half (数组大小减半)

数组大小减半思路简单&#xff0c;主要是熟悉python中collections.Counter的用法&#xff0c;采用贪心策略即可。 示例&#xff1a; 图1 数组大小减半输入输出示例 代码&#xff1a; class Solution:def minSetSize(self, arr):count Counter(arr)n, ans 0, 0for i, valu…

【ESP32 手机配网教程】

【ESP32 手机配网教程】 1. 前言2. 先决条件2.1 环境配置2.2 所需零件3.3 硬件连接步骤 3. Web热点手动配网3.1. 准备工作3.2. 编译上传程序3.3. 进行手动配网 4. BLE无线配网4.1. 准备工作**4.2. 编译上传程序4.3. 使用手机APP进行无线配网 5. 总结 1. 前言 欢迎使用ESP32进行…