首页 > 数据库 >大数据202411月最新SQL面试题,值得一刷

大数据202411月最新SQL面试题,值得一刷

时间:2024-11-16 22:50:13浏览次数:3  
标签:面试题 empgo t2 202411 producee select 一刷 dt 202101

以下是面试时公司最新的面试题,我自己做了一遍,讲了一遍,代码都是亲自测试和编写的,希望对大家有所帮助,有问题欢迎留言,如果对你有用,留个好评,谢谢了!!

1. 表如下,请计算每个月每个部门评分大于等于90的人数,评分大于等于90的人数环比增长率,评分有提升的人数。

年月	姓名	部门	 评分
202101	张三	销售	90
202101	李四	技术	90
202101	王五	运营	80
202101	赵六	销售	70
202101	孙七	技术	95
202101	周八	运营	93
202101	吴九	销售	84
202101	郑十	技术	83
202102	张三	销售	95
202102	李四	技术	95
202102	王五	运营	95
202102	赵六	销售	95

思路:

1、获取每个月每个部门评分大于等于90的人数 -- t1

2、将 t1 和 t1 自关联,求增长率

3、将自身的表和自身的表关联,求分数有提升的人数

4、将所有的结果展示一下

本地模式:
set hive.exec.mode.local.auto=true;
//开启本地mr
//设置local mr的最大输入数据量,当输入数据量小于这个值时采用local  mr的方式,默认为134217728,即128M
set hive.exec.mode.local.auto.inputbytes.max=50000000;
//设置local mr的最大输入文件个数,当输入文件个数小于这个值时采用local mr的方式,默认为4
set hive.exec.mode.local.auto.input.files.max=10;

CREATE TABLE `empgo` (
  dt STRING  ,
  name STRING  ,
  dept STRING  ,
  score int
);
set hive.stats.column.autogather=false;
insert into empgo values ('202101','张三','销售','90');
insert into empgo values ('202101','李四','财务','90');
insert into empgo values ('202101','王五','运营','80');
insert into empgo values ('202101','赵六','销售','70');
insert into empgo values ('202101','孙七','技术','95');
insert into empgo values ('202101','周八','运营','93');
insert into empgo values ('202101','吴九','销售','84');
insert into empgo values ('202101','郑十','技术','83');
insert into empgo values ('202102','张三','销售','95');
insert into empgo values ('202102','李四','技术','95');
insert into empgo values ('202102','王五','运营','95');
insert into empgo values ('202102','赵六','销售','95');

启动 spark 的服务:

hive-server-manager.sh stop hiveserver2

/opt/installs/spark/sbin/start-thriftserver.sh \
--hiveconf hive.server2.thrift.port=10001 \
--hiveconf hive.server2.thrift.bind.host=shucang \
--master yarn \
--conf spark.sql.shuffle.partitions=2

看 hive 的日志,你觉得需要看什么?

1、hive.log

2、metastore.log hiveserver2.log

3、hadoop 的日志(yarn 的日志)

环比增长率=2月人数/1月人数-1

第一步:

select dt,dept,count(1) peopleNum from empgo where score >=90 group by dt,dept;

第二步:将 t1 和 t1 自关联,求增长率

with t as (
    select dt,dept,count(1) peopleNum from empgo where score >=90 group by dt,dept
)
select t2.dt,t2.dept,round((t2.peopleNum-t1.peopleNum)/t1.peopleNum-1,2) from t t1 join t t2 on t1.dept = t2.dept and t1.dt = date_format(add_months(from_unixtime(unix_timestamp(t2.dt,'yyyyMM')),1),'yyyyMM')
;

结果:

还有另一个做法:

with t as (
    select dt,dept,count(1) peopleNum from empgo where score >=90 group by dt,dept
),t2 as(
    select *,lag(peopleNum,1,peopleNum) over(partition by dept order by dt ) lastMonthNum from t
)
select t2.dept,t2.dt,peopleNum/lastMonthNum-1 from t2 ;

第三步:将自身的表和自身的表关联,求分数有提升的人数

with getlastscore as (
    select *,lag(score,1,score) over(partition by name order by dt ) lastScore from empgo
)
select * from getlastscore ;

with getlastscore as (
    select *,lag(score,1,score) over(partition by name order by dt ) lastScore from empgo
)
select dt,count(1) score_growth_num from getlastscore where score > lastScore group by dt ;


-- 请计算每个月每个部门评分大于等于90的人数,评分大于等于90的人数环比增长率,评分有提升的人数。
with t as (
    select dt,dept,count(1) peopleNum from empgo where score >=90 group by dt,dept
),rate_growth as(
    select t2.dt,t2.dept,round((t2.peopleNum/t1.peopleNum)-1,2) grow_rate,t1.dt tt from t t1 join t t2 on t1.dept = t2.dept and t1.dt = date_format(add_months(from_unixtime(unix_timestamp(t2.dt,'yyyyMM')),1),'yyyyMM')
),getlastscore as (

    select *,lag(score,1,score) over(partition by name order by dt ) lastScore from empgo
),score_growth as (
    select dt,count(1) score_growth_num from getlastscore where score > lastScore group by dt
)
select
    t.dt,
    t.dept,
    t.peopleNum,
    rate_growth.grow_rate,
    score_growth_num
    from t left join rate_growth on  t.dt=rate_growth.tt and t.dept = rate_growth.dept
      left join score_growth on t.dt = score_growth.dt
;

最终结果:

2.交易记录表,表结构如下,请计算每个月各产品的购货人数,购货金额,购货金额排名,复购人数

(复购:前5个月曾购买此产品,本月有购买;购买: 购货金额大于0)

年月	订单号	原定单号	是否退货单	产品	购货人	金额	数量
202101	s100000	s100000	0	苹果	A	10	2
202101	s100001	s100000	1	苹果	A	-10	2
202101	s100002	s100002	0	西瓜	C	50	1
202106	s100003	s100003	0	西瓜	C	50	1
202102	...	...	...	...	...	...	...
create table deal (
  dt string,
  orderId string,
  oldOrderId string,
  isReturn int,
  producee string,
  customer string,
  money int,
  num int
);

insert into deal values ('202101','s100000','s100000',0,'苹果','A',10,2);
insert into deal values ('202101','s100001','s100000',1,'苹果','A',-10,2);
insert into deal values ('202101','s100002','s100002',0,'西瓜','C',50,1);
insert into deal values ('202106','s100003'	,'s100003',0,'西瓜','C',	50,1);
insert into deal values ('202101','s100004'	,'s100004',0,'西瓜','A',	50,1);
-- 请计算每个月各产品的购货人数,购货金额,购货金额排名,复购人数
-- (复购:前5个月曾购买此产品,本月有购买;购买: 购货金额大于0)

-- 第一步:求每个月各产品的购货人数,购货金额
select dt,producee,sum(money) from deal where money > 0 group by dt,producee ;
-- 第二步:每个月每个产品的购货排名
with t as (
    select dt,producee,sum(money) summoney from deal where money > 0 group by dt,producee
),t2 as(
    select dt,producee,dense_rank() over(partition by dt order by summoney desc) paiming from t
)
select * from t2;
-- 第三步:求每一个月每个产品的复购人数
-- 复购人数  (复购:前5个月曾购买此产品,本月有购买;购买: 购货金额大于0)
select d1.dt,d1.producee,count(1) fugou from deal d1 left join  deal d2
   on d1.customer = d2.customer and d1.producee = d2.producee
   where d2.dt >=  date_format(add_months(from_unixtime(unix_timestamp(d1.dt,'yyyyMM')),-5),'yyyyMM')
      and d2.dt < d1.dt group by d1.dt,d1.producee;

-- 综合一下sql语句即可:
-- 请计算每个月各产品的购货人数,购货金额,购货金额排名,复购人数
-- -- (复购:前5个月曾购买此产品,本月有购买;购买: 购货金额大于0)

with t as (
    select dt,producee,sum(money) summoney,count(distinct customer) peopleNum  from deal where money > 0 group by dt,producee
),t2 as(
    select dt,producee,dense_rank() over(partition by dt order by summoney desc) paiming from t
),t3 as (
    select d1.dt,d1.producee,count(1) fugou from deal d1 left join  deal d2
   on d1.customer = d2.customer and d1.producee = d2.producee
   where d2.dt >=  date_format(add_months(from_unixtime(unix_timestamp(d1.dt,'yyyyMM')),-5),'yyyyMM')
      and d2.dt < d1.dt group by d1.dt,d1.producee
)
select t.dt,
       t.producee,
       t.summoney,
       t.peopleNum,
       t2.paiming,
       nvl(t3.fugou,0)
   from t join t2 on t.dt=t2.dt and t.producee=t2.producee left join t3 on t.dt=t3.dt and t.producee=t3.producee;

最终结果:

3、交易记录表,表结构如下,请计算每个月购货人同时购买苹果和西瓜的金额(购货人单月只购买其中一样不计算,需在一个月内两个都购买)

年月	订单号	原定单号	是否退货单	产品	购货人	金额	数量
202101	s100000	s100000	0	苹果	A	10	2
202101	s100001	s100000	1	苹果	A	-10	2
202101	s100002	s100002	0	西瓜	C	50	1
202101	s100003	s100003	0	苹果	C	10	1
202102	...	...	...	...	...	...	...
CREATE TABLE IF NOT EXISTS orders_info (
    year_month string,
    order_number string,
    original_order_number string,
    is_return_order int,
    product string,
    purchaser string,
    amount double,
    quantity int
);

INSERT INTO TABLE orders_info
VALUES
    ('202101','s100000','s100000',0,'苹果','A',10.0,2),
    ('202101','s100001','s100000',1,'苹果','A',-10.0,2),
    ('202101','s100002','s100002',0,'西瓜','C',50.0,1),
    ('202101','s100003','s100003',0,'苹果','C',10.0,1);

思路:

1、先获取购买西瓜或者苹果的人的信息

2、将两个表关联,谁的条数等于 2 就是谁

with t as (

select year_month,purchaser,product,sum(amount) total_money from orders_info where product='西瓜' or product='苹果' and amount >0 group by  year_month,purchaser,product
)
select count(product) cc,purchaser,year_month,sum(total_money) sumMoney from t group by year_month,purchaser having cc = 2;

 

标签:面试题,empgo,t2,202411,producee,select,一刷,dt,202101
From: https://blog.csdn.net/wozhendeyumenle/article/details/143824109

相关文章

  • 面试题整理---自己努力,人只能靠自己。
     事情:**1.工作经验?【重点】面试官您好,我叫某某某,毕业于某大学,毕业之后做的主要是软件测试相关工作。   **2.熟悉的项目?【重点】【听得见吗?你复述一遍。复述一遍。复述一遍。】  **简历更新。我就说我做测试数据。 打印一份最新的简历。 *面试,怎么口头描述测试用......
  • [20241114]建立完善mod_addr.sh脚本.txt
    [20241114]建立完善ext_kglob.sh脚本.txt--//以前考虑使用管道问题,我考虑复杂了,看了gdb文档,实际上gdb-ex参数支持在命令行加入执行命令。--//选择使用mmon后台进程,改写如下:$catext_kglob.sh#/bin/bash#extraceobjectstringfromobjecthandleaddress#arg1=addressarg2=o......
  • LLM-面试题
    LLM推理和训练占用显存https://blog.csdn.net/weixin_44292902/article/details/133767448https://www.53ai.com/news/finetuning/2024083051493.html推荐,讲解训练和推理时的显存占用,lora和qlora。如果模型参数量为X(fp16),推理一般占用2X(模型参数+各种激活值,beams......
  • Metasploit Pro 4.22.5-2024111401 (Linux, Windows) - 专业渗透测试框架
    MetasploitPro4.22.5-2024111401(Linux,Windows)-专业渗透测试框架Rapid7Penetrationtesting,releasedNov14,2024请访问原文链接:https://sysin.org/blog/metasploit-pro-4/查看最新版。原创作品,转载请保留出处。作者主页:sysin.org世界上最广泛使用的渗透测试框......
  • [鲜花] 20241115 My(self+life).
    它是我的生命。我透过明亮的镜子看过去,是我与我的生命的像,还有它的影子,还有那些...意料之外,情理之中。或许我早就感知到它的存在,生活中总是能感觉到它的温度:触碰到了它的体感肌肤,传递冷暖于我。我想找到它,或者说:我想找到属于我自己的东西。可在我轻微的挪动之后,它彻底不见了。从......
  • 20241115
    Talesofseafaring发现需要维护最短路为单数和双数的最短路,所以先跑个最短路,然后对于每个询问看d是单数还是双数,然后判断输出就行,注意到直接这么写然后对于每个询问再查的话空间会爆,所以就把询问记录下来对于每个点为起始跑最短路的时候直接更新答案就行。公路修建问题求最大......
  • MyBatis面试题--(与数据库连接的相关知识)
    目录在MyBatis中,Mapper接口的作用是什么?当实体类中属性名和表中的字段名不一样,怎么办?1.使用@Result注解2.使用resultMap元素3.使用@Results注解(MyBatis3.4.1+)4.使用mapUnderscoreToCamelCase属性在MyBatis中如何实现分页功能?1.使用MyBatis分页插件2.手动编写分页SQL3.使......
  • linux运维面试题【基础篇】
    前言本篇主要分享linux运维面试过程中常见的面试题材,当时自己面试的时候就遇到3道原题,最终也是顺利通过面试,下面给大家分享一下:面试题库1、描述Linux系统的启动过程电源BIOS自检读取MBR,运行grub加载内核内核启动/sbin/init程序,进行系统初始化根据系统运行级别执行......
  • 深入理解 MySQL 大小写敏感性:配置、问题与实践指南20241115
    深入理解MySQL大小写敏感性:配置、问题与实践指南在开发和部署MySQL数据库时,表名的大小写敏感性问题常常被忽略,却可能在跨平台迁移、团队协作或工具兼容性方面引发复杂的故障。本文将结合实际案例,深入探讨MySQL的lower_case_table_names参数,剖析其行为、配置方法以......
  • 面试必备41道 SpringBoot 面试题
    博主介绍上海交大毕业,大厂资深Java后端工程师《Java全套学习资料》作者专注于系统架构设计和高并发解决方案和面试辅导阿里云开发社区乘风者计划专家博主@author[vx]vip1024p(备注java)/***@author[vx]vip1024p(备注java)*@【描述:浏览器打开】docs.qq.com/doc/DUk......