前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >常见经典数仓面试题

常见经典数仓面试题

作者头像
伊泽瑞尔
发布2022-06-01 08:35:35
1.1K0
发布2022-06-01 08:35:35
举报

1.去重连续列,只连续重复的第一行。

表如下:

代码语言:javascript
复制
a 	b 
1	10
2	11
3	11
4	11
5	12
6	12
7	13

拿出b列连续重复的第一个行。输出如下:

代码语言:javascript
复制
1	10
2	11
5	12
7	13

答案:

代码语言:javascript
复制
select 
	t1.a,
    t1.b
from ( select 1 a,
               10 b
     union all select 2 a,
               11 b
     union all select 3 a,
               11 b
     union all select 4 a,
               11 b
     union all select 5 a,
               12 b
     union all select 6 a,
               12 b
     union all select 7 a,
               13 b) t1
               left join
               (select 1 a,
               10 b
     union all select 2 a,
               11 b
     union all select 3 a,
               11 b
     union all select 4 a,
               11 b
     union all select 5 a,
               12 b
     union all select 6 a,
               12 b
     union all select 7 a,
               13 b) t2
               on t1.a = t2.a + 1
               where case when t1.b = t2.b then null else t1.b end is not null
               ;

2.SQL 求某天各个直播间同时最大在线人数与时刻。

代码语言:javascript
复制
表字段:

live_id 直播id,
userid  用户id,
date_stamp  时间戳,
entry_type  登陆状态,登陆(enter)和登出(out)

答案:

代码语言:javascript
复制
select live_id,
       date_stamp,
       cnt
  from (
        select live_id,
               date_stamp,
               cnt,
               rank() over(order by cnt desc) rn
          from (
                select live_id,
                       date_stamp,
                       sum(flag) over (order by date_stamp) as cnt
                  from (
                        select live_id,
                               userid,
                               date_stamp as date_stamp,
                               case when entry_type = 'enter' then 1
                                    when entry_type = 'out'   then -1
                                    else 0
                                     end flag
                          from (
                                select 1 live_id,
                                       'A' userid,
                                       '20200801 10:00:00' date_stamp,
                                       'enter' entry_type
                             union all select 1 live_id,
                                       'B' userid,
                                       '20200801 10:01:00' date_stamp,
                                       'enter' entry_type
                             union all select 1 live_id,
                                       'A' userid,
                                       '20200801 10:01:01' date_stamp,
                                       'out' entry_type
                             union all select 1 live_id,
                                       'C' userid,
                                       '20200801 10:02:03' date_stamp,
                                       'enter' entry_type
                               )
                       )
                 group by live_id,
                          date_stamp,
                          flag
               ) t1
       ) t2
 where rn = 1

3.hive的row_number()、rank()和dense_rank()的区别以及具体使用

表如下:

代码语言:javascript
复制
a 	b 
1	10
2	11
3	11
4	11
5	12
6	12
7	13

执行sql:

代码语言:javascript
复制
select a,
       b,
       row_number() over(order by b) row_number,
       rank() over(order by b) rank,
       dense_rank() over(order by b) dense_rank
  from (
        select 1 a,
               10 b
     union all select 2 a,
               11 b
     union all select 3 a,
               11 b
     union all select 4 a,
               11 b
     union all select 5 a,
               12 b
     union all select 6 a,
               12 b
     union all select 7 a,
               13 b
       ) t

结果:

代码语言:javascript
复制
a	b	row_number	rank	dense_rank
1	10	1	         1	      1
2	11	2	         2	      2
3	11	3	         2	      2
4	11	4	         2	      2
5	12	5	         5	      3
6	12	6	         5	      3
7	13	7	         7	      4

总结:

row_number:不管排名是否有相同的,都按照顺序1,2,3...

rank:排名相同的名次一样,同一排名有几个,后面排名就会跳过几次

dense_rank:排名相同的名次一样,且后面名次不跳跃

4.hive解析array,map,struct,json

array:array中的数据为相同类型,例如,假如array A中元素['a','b','c'],则A[0]的值为'a'。

map(K-V对):访问指定域可以通过["指定域名称"]进行,例如,一个Map M包含了一个{"name":"b"}的kv对,gid的值可以通过M['name']来获取。

struct:struct内部的数据可以通过DOT(.)来存取,例如,表中一列c的类型为STRUCT{a INT; b INT},我们可以通过c.a来访问域a。

json:通过get_json_object获取,例如,tag字段{"data":"test"},可以通过get_json_object(tag, '$.data')获取。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据与知识图谱 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.去重连续列,只连续重复的第一行。
  • 2.SQL 求某天各个直播间同时最大在线人数与时刻。
  • 3.hive的row_number()、rank()和dense_rank()的区别以及具体使用
  • 4.hive解析array,map,struct,json
相关产品与服务
云直播
云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档