Hive SQL常考面试题

多列转多行

test:
在这里插入图片描述result:
在这里插入图片描述

select
	a.name,
	b.subject,
	b.score
from test as a
lateral view explode(
	map(
		'语文',chinese,
		'数学',math,
		'英语',english
	)
) b as subject, score;
select
	a.name,
	b.subject,
	b.score
from test as a
lateral view explode(
	str_to_map(concat(
		'语文=',chinese,
		'&数学=',math,
		'&英语=',english
	), '&', '=')
) b as subject, score;

多行转多列

test:
在这里插入图片描述
result:
在这里插入图片描述

select
	name,
	sum(case when subject='语文' then score else 0 end) chinese,
	sum(case when subject='数学' then score else 0 end) as math,
	sum(case when subject='英语' then score else 0 end) english,
from test
group by name;

topN

select *
from(
		select 
			name,
			subject,
			score,
			row_number() over(partition by subject order by score desc) as rank
		from test
	) tmp
where tmp.rank <= 3;

求连续3天登录用户

wang,2020-05-01
wang,2020-05-02
wang,2020-05-03
wang,2020-05-04

wang,2020-05-07
zhao,2020-04-01
zhao,2020-04-01
zhao,2020-04-07
zhao,2020-05-09
zhao,2020-05-10
li,2020-01-10
li,2020-01-12
li,2020-01-13
li,2020-01-14

li,2020-02-12
li,2020-02-13

select
	t.id,
	date_sub(t.login_date, t.rank) as flag_date,
	count(1) as continuous_days
from (
	select
		id,
		login_date,
		row_number() over(partition by id order by login_date) as rank
	from login
) t
group by t.id, date_sub(t.login_date, t.rank)
having count(1) >= 3;

在这里插入图片描述

select
	m.id
from(
	select
		t.id,
		date_sub(t.login_date, t.rank) as flag_date,
		count(1) as continuous_days
	from (
		select
			id,
			login_date,
			row_number() over(partition by id order by login_date) as rank
		from login
	) t
	group by t.id, date_sub(t.login_date, t.rank)
	having count(1) >= 3;
) m
group by m.id;

求连续n天登录用户

select t.user_id
from
(select
    user_id,
    datediff(login_date, lag(login_date, n-1, -1) over(partition by user_id order by login_date)) 
    as diff
from login) t
where diff = n-1
group by t.user_id;

select m.user_id
from
    (select t.user_id, count(1)
    from
        (select user_id, login_date,
            row_number() over(partition by user_id order by login_date) as rank
        from login) t
    group by t.user_id, date_sub(t.login_date, t.rank)
    where count(1) >= n
    ) m
group by m.user_id;

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

TigRer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值