100天SQL面试刷题 Day003

这是一篇关于SQL面试的博客,内容涉及近7天各城市订单量统计、占比计算、上海单量及排名、用户购买最多外卖品类等题目解析,通过案例详细讲解了date_sub、curdate、group by、count、window function等SQL知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看题目自己试着解一下,有困难的同学可以先看考点解析试下,
最后再看SQL解答,有不同意见和解法的欢迎评论区留言交流


来源:大厂面试真题

题目:

【1】现有交易数据明细表 user_goods_table 如下:
user_name 用户名
date 下单日期
city_name 下单所在城市
order_number 订单号
goods_kind 用户订购的的外卖品类
sku_id 用户购买的商品
ID sku_name 用户购买的商品名称 num 数量

请按以下要求编写SQL查询:

  1. 近 7 天,每天各城市总单量
  2. 近 7 天,每天各城市的单量在全国总单量中的占比,结果以百分比显示保留两位小数
  3. 近 7 天,上海市每日单量和累计单量
  4. 拉取近 7 天,每天各城市总单量的排名
  5. 近 7 天上海市,每个用户购买最多的外卖品类分别是哪个 。输出要求如下: user_name 用户名 goods_kind 该用户购买的最多外卖品类
user_namedateday_numcity_nameorder_numbergoods_kindsku_idsku_namenum
A0012023/7/3 0:000北京'1003887892136A'74696815随机11
A0022023/7/2 0:001北京'1005064667309B'45694701随机93
A0032023/7/1 0:002上海'1009389809705A'58585992随机12
A0042023/6/30 0:003深圳'1008250650306C'50432693随机23
A0052023/6/29 0:004杭州'1009977503419D'49481095随机34
A0062023/6/28 0:005上海'1007870492015B'44044231随机61
A0072023/6/27 0:006南京'1005278176195E'78072661随机72
A0082023/6/26 0:007北京'1004993853535A'21327409随机84
A0092023/6/25 0:008上海'1002658059711F'40984501随机93
A0102023/6/24 0:009北京'1007862991739A'53306964随机13
A0112023/6/23 0:0010北京'1009176079538B'35126040随机21
A0122023/6/22 0:0011上海'1003283849139A'75512162随机35
A0012023/6/21 0:0012深圳'1005309121451C'16972175随机42
A0022023/7/3 0:000杭州'1008432457883D'40643753随机53
A0032023/7/3 0:000上海'1006219163729B'46484869随机62
A0042023/7/2 0:001广州'1001344025562E'37473733随机73
A0052023/7/1 0:002北京'1002080528170A'66382803随机82
A0062023/6/30 0:003上海'1001794915821F'11932822随机94
A0012023/7/3 0:000北京'1007408706780A'32988274随机34
A0022023/7/2 0:001北京'1005769283808B'65429791随机42
A0032023/7/1 0:002上海'1007434060136A'73899401随机51
A0042023/6/30 0:003深圳'1002842229878C'46885196随机54
A0052023/6/29 0:004杭州'1007076524029D'34396380随机43
A0062023/6/28 0:005上海'1008068624085B'60142654随机55
A0072023/6/27 0:006南京'1001965114347E'10507129随机51
A0082023/6/26 0:007北京'1001916308114A'27310633随机61
A0092023/6/25 0:008上海'1005935754286F'80570037随机71
A0102023/6/24 0:009北京'1002273475054A'38987004随机84
A0112023/6/23 0:0010北京'1005729675662B'66338170随机73
A0122023/6/22 0:0011上海'1005046041350A'47768813随机82
A0012023/6/21 0:0012深圳'1003795764689C'90967505随机94
A0022023/7/3 0:000杭州'1001569464839D'45301007随机24
A0032023/7/3 0:000上海'1005321717416B'41454673随机71
A0042023/7/2 0:001广州'1005128597676E'59339022随机84
A0052023/7/1 0:002北京'1006325509528A'86094427随机93
A0062023/6/30 0:003上海'1004855507423F'13034047随机14

题目数据下载

结果输出

Q1执行结果
Q1执行结果

Q2执行结果
在这里插入图片描述
Q3执行结果
在这里插入图片描述

Q4执行结果
在这里插入图片描述

Q5执行结果
在这里插入图片描述

考点解析

Q1:
逻辑口述:

date_sub+curdate 计算出七天前的日期(注意含不含今天),使用between and 筛选出符合日期的数据, 再对筛选结果 用group by 聚合+对order_num 用count 计数

主要考点:
日期计算:date_sub
当前日期:curdate
分组统计:group by + count

Q2:
逻辑口述:
针对Q1筛选出来的数据,不聚合,使用开窗count() over()把聚合后的结果分列在每一行,一个按city_name聚合,一个不聚合(得到的就是全国的订单总量),把两个数据相除得到占比,在外面嵌套distinct去重即可

考察点
count,max,sum 开窗与不开窗的区别

with as 创建中间表

Q3:
逻辑口述:
针对给定条件筛选出来的数据,
使用count() over 开窗函数进行累计

考察点

Q4:
逻辑口述:

考察点: row_number, rank, dense_rank 排序的窗口函数
Q5:
逻辑口述:

考察点: row_number, rank, dense_rank 排序的窗口函数

SQL代码

--Q1
SELECT city_name,count(order_number) total_order FROM ` user_goods_table`
where `date` between date_sub(curdate(),interval 6 day) and  curdate()
group by city_name;

--Q2
# 方法一  开窗函数:
select distinct city_name, concat(round(percent*100,2),"%") city_percent
 from (
SELECT *,
count(order_number) over(partition by city_name)
/count(order_number) over()  percent
FROM ` user_goods_table`
where `date` between date_sub(curdate(),interval 6 day) and  curdate()) tmp;

# 方法二:

with tmp as (SELECT 
city_name, 
count(order_number) city_order
 FROM ` user_goods_table`
where `date` between date_sub(curdate(),interval 6 day) and  curdate()
group by city_name ) 

select city_name, city_order/sum(city_order) over()  from tmp;
-- select city_name, city_order/(select sum(city_order) from tmp)  from tmp ;


-- 总计行的计算
--SELECT 
-- COALESCE(city_name,"总计")  city_name, 
-- count(order_number) city_order
--  FROM ` user_goods_table`
-- where `date` between date_sub(curdate(),interval 6 day) and  curdate()
-- group by city_name 
-- with rollup;


--Q3
-- SQL关键词执行顺序,group by 在select 之前执行
--partition by 和group by不能一起使用,重复分组了,先group by 再 partition by 
SELECT 
distinct city_name, 
date_format(`date`,"%Y-%m-%d") `date`,
count(order_number)over( partition by `date`) orders_day,
count(order_number)over(order by `date`) cum_orders_day
 FROM ` user_goods_table`
where `date` between date_sub(curdate(),interval 6 day) and  curdate()
and city_name = "上海" 

--Q4
-- 使用 num 商品数量计算,数据为自主生成,order_num count 每天都是2,排名都是1,看不出来排差异
select *,
dense_rank()over(partition by city_name order by city_orders_d ) `rank`   from (
SELECT 
city_name,
date_format(`date`,"%Y-%m-%d") `date`,
sum(num)  city_orders_d
 FROM ` user_goods_table`
where `date` between date_sub(curdate(),interval 6 day) and  curdate()
group by city_name,`date`) tmp


--Q5
select user_name, goods_kind from (
select *,
rank() over(partition by user_name  order by nums_user) rk from (
SELECT 
user_name,
goods_kind,
sum(num) nums_user
 FROM ` user_goods_table`
where `date` between date_sub(curdate(),interval 6 day) and  curdate()
group by user_name,goods_kind) tmp) t2
where rk = 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诡途

你的鼓励是我 创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值