最强最全面的大数据SQL经典面试题(由31位大佬共同协作完成)(一)

简介: 本套SQL题的答案是由许多小伙伴共同贡献的,1+1的力量是远远大于2的,有不少题目都采用了非常巧妙的解法,也有不少题目有多种解法。本套大数据SQL题不仅题目丰富多样,答案更是精彩绝伦!

本套SQL题的答案是由许多小伙伴共同贡献的,1+1的力量是远远大于2的,有不少题目都采用了非常巧妙的解法,也有不少题目有多种解法。本套大数据SQL题不仅题目丰富多样,答案更是精彩绝伦!


注:以下参考答案都经过简单数据场景进行测试通过,但并未测试其他复杂情况。本文档的SQL主要使用Hive SQL。


一、行列转换



描述:表中记录了各年份各部门的平均绩效考核成绩。


表名:t1


表结构:


a -- 年份
b -- 部门
c -- 绩效得分


表内容


a   b  c
2014  B  9
2015  A  8
2014  A  10
2015  B  7


问题一:多行转多列


问题描述:将上述表内容转为如下输出结果所示:


a  col_A col_B
2014  10   9
2015  8    7


参考答案


select 
    a,
    max(case when b="A" then c end) col_A,
    max(case when b="B" then c end) col_B
from t1
group by a;


问题二:如何将结果转成源表?(多列转多行)


问题描述:将问题一的结果转成源表,问题一结果表名为t1_2


参考答案


select 
    a,
    b,
    c
from (
    select a,"A" as b,col_a as c from t1_2 
    union all 
    select a,"B" as b,col_b as c from t1_2  
)tmp;


问题三:同一部门会有多个绩效,求多行转多列结果


问题描述:2014年公司组织架构调整,导致部门出现多个绩效,业务及人员不同,无法合并算绩效,源表内容如下:


2014  B  9
2015  A  8
2014  A  10
2015  B  7
2014  B  6


输出结果如下所示


a    col_A  col_B
2014   10    6,9
2015   8     7


参考答案:


select 
    a,
    max(case when b="A" then c end) col_A,
    max(case when b="B" then c end) col_B
from (
    select 
        a,
        b,
        concat_ws(",",collect_set(cast(c as string))) as c
    from t1
    group by a,b
)tmp
group by a;


二、排名中取他值



表名t2


表字段及内容


a    b   c
2014  A   3
2014  B   1
2014  C   2
2015  A   4
2015  D   3


问题一:按a分组取b字段最小时对应的c字段


输出结果如下所示


a   min_c
2014  3
2015  4


参考答案:


select
  a,
  c as min_c
from
(
      select
        a,
        b,
        c,
        row_number() over(partition by a order by b) as rn 
      from t2 
)a
where rn = 1;


问题二:按a分组取b字段排第二时对应的c字段


输出结果如下所示


a  second_c
2014  1
2015  3


参考答案


select
  a,
  c as second_c
from
(
      select
        a,
        b,
        c,
        row_number() over(partition by a order by b) as rn 
      from t2 
)a
where rn = 2;


问题三:按a分组取b字段最小和最大时对应的c字段


输出结果如下所示


a    min_c  max_c
2014  3      2
2015  4      3


参考答案:


select
  a,
  min(if(asc_rn = 1, c, null)) as min_c,
  max(if(desc_rn = 1, c, null)) as max_c
from
(
      select
        a,
        b,
        c,
        row_number() over(partition by a order by b) as asc_rn,
        row_number() over(partition by a order by b desc) as desc_rn 
      from t2 
)a
where asc_rn = 1 or desc_rn = 1
group by a;


问题四:按a分组取b字段第二小和第二大时对应的c字段


输出结果如下所示


a    min_c  max_c
2014  1      1
2015  3      4


参考答案


select
    ret.a
    ,max(case when ret.rn_min = 2 then ret.c else null end) as min_c
    ,max(case when ret.rn_max = 2 then ret.c else null end) as max_c
from (
    select
        *
        ,row_number() over(partition by t2.a order by t2.b) as rn_min
        ,row_number() over(partition by t2.a order by t2.b desc) as rn_max
    from t2
) as ret
where ret.rn_min = 2
or ret.rn_max = 2
group by ret.a;


问题五:按a分组取b字段前两小和前两大时对应的c字段


注意:需保持b字段最小、最大排首位


输出结果如下所示


a    min_c  max_c
2014  3,1     2,1
2015  4,3     3,4


参考答案


select
  tmp1.a as a,
  min_c,
  max_c
from 
(
  select 
    a,
    concat_ws(',', collect_list(c)) as min_c
  from
    (
     select
       a,
       b,
       c,
       row_number() over(partition by a order by b) as asc_rn
     from t2
     )a
    where asc_rn <= 2 
    group by a 
)tmp1 
join 
(
  select 
    a,
    concat_ws(',', collect_list(c)) as max_c
  from
    (
     select
        a,
        b,
        c,
        row_number() over(partition by a order by b desc) as desc_rn 
     from t2
    )a
    where desc_rn <= 2
    group by a 
)tmp2 
on tmp1.a = tmp2.a;


三、累计求值



表名t3


表字段及内容


a    b   c
2014  A   3
2014  B   1
2014  C   2
2015  A   4
2015  D   3


问题一:按a分组按b字段排序,对c累计求和


输出结果如下所示


a    b   sum_c
2014  A   3
2014  B   4
2014  C   6
2015  A   4
2015  D   7


参考答案


select 
  a, 
  b, 
  c, 
  sum(c) over(partition by a order by b) as sum_c
from t3;


问题二:按a分组按b字段排序,对c取累计平均值


输出结果如下所示


a    b   avg_c
2014  A   3
2014  B   2
2014  C   2
2015  A   4
2015  D   3.5


参考答案


select 
  a, 
  b, 
  c, 
  avg(c) over(partition by a order by b) as avg_c
from t3;


问题三:按a分组按b字段排序,对b取累计排名比例


输出结果如下所示


a    b   ratio_c
2014  A   0.33
2014  B   0.67
2014  C   1.00
2015  A   0.50
2015  D   1.00


参考答案


select 
  a, 
  b, 
  c, 
  round(row_number() over(partition by a order by b) / (count(c) over(partition by a)),2) as ratio_c
from t3 
order by a,b;


问题四:按a分组按b字段排序,对b取累计求和比例


输出结果如下所示


a    b   ratio_c
2014  A   0.50
2014  B   0.67
2014  C   1.00
2015  A   0.57
2015  D   1.00


参考答案


select 
  a, 
  b, 
  c, 
  round(sum(c) over(partition by a order by b) / (sum(c) over(partition by a)),2) as ratio_c
from t3 
order by a,b;


四、窗口大小控制



表名t4


表字段及内容


a    b   c
2014  A   3
2014  B   1
2014  C   2
2015  A   4
2015  D   3


问题一:按a分组按b字段排序,对c取前后各一行的和


输出结果如下所示


a    b   sum_c
2014  A   1
2014  B   5
2014  C   1
2015  A   3
2015  D   4


参考答案


select 
  a,
  b,
  lag(c,1,0) over(partition by a order by b)+lead(c,1,0) over(partition by a order by b) as sum_c
from t4;


问题二:按a分组按b字段排序,对c取平均值


问题描述:前一行与当前行的均值!


输出结果如下所示


a    b   avg_c
2014  A   3
2014  B   2
2014  C   1.5
2015  A   4
2015  D   3.5


参考答案


select
  a,
  b,
  case when lag_c is null then c
  else (c+lag_c)/2 end as avg_c
from
 (
 select
   a,
   b,
   c,
   lag(c,1) over(partition by a order by b) as lag_c
  from t4
 )temp;
相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
相关文章
|
11月前
|
SQL 存储 分布式计算
【万字长文,建议收藏】《高性能ODPS SQL章法》——用古人智慧驾驭大数据战场
本文旨在帮助非专业数据研发但是有高频ODPS使用需求的同学们(如数分、算法、产品等)能够快速上手ODPS查询优化,实现高性能查数看数,避免日常工作中因SQL任务卡壳、失败等情况造成的工作产出delay甚至集群资源稳定性问题。
1847 36
【万字长文,建议收藏】《高性能ODPS SQL章法》——用古人智慧驾驭大数据战场
|
SQL 人工智能 分布式计算
别再只会写SQL了!这五个大数据趋势正在悄悄改变行业格局
别再只会写SQL了!这五个大数据趋势正在悄悄改变行业格局
345 0
|
SQL 分布式计算 大数据
SparkSQL 入门指南:小白也能懂的大数据 SQL 处理神器
在大数据处理的领域,SparkSQL 是一种非常强大的工具,它可以让开发人员以 SQL 的方式处理和查询大规模数据集。SparkSQL 集成了 SQL 查询引擎和 Spark 的分布式计算引擎,使得我们可以在分布式环境下执行 SQL 查询,并能利用 Spark 的强大计算能力进行数据分析。
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
11月前
|
机器学习/深度学习 传感器 分布式计算
数据才是真救命的:聊聊如何用大数据提升灾难预警的精准度
数据才是真救命的:聊聊如何用大数据提升灾难预警的精准度
681 14
|
数据采集 分布式计算 DataWorks
ODPS在某公共数据项目上的实践
本项目基于公共数据定义及ODPS与DataWorks技术,构建一体化智能化数据平台,涵盖数据目录、归集、治理、共享与开放六大目标。通过十大子系统实现全流程管理,强化数据安全与流通,提升业务效率与决策能力,助力数字化改革。
443 4
|
机器学习/深度学习 运维 监控
运维不怕事多,就怕没数据——用大数据喂饱你的运维策略
运维不怕事多,就怕没数据——用大数据喂饱你的运维策略
1109 0
|
11月前
|
传感器 人工智能 监控
数据下田,庄稼不“瞎种”——聊聊大数据如何帮农业提效
数据下田,庄稼不“瞎种”——聊聊大数据如何帮农业提效
332 14
|
11月前
|
机器学习/深度学习 传感器 监控
吃得安心靠数据?聊聊用大数据盯紧咱们的餐桌安全
吃得安心靠数据?聊聊用大数据盯紧咱们的餐桌安全
349 1