总结面试:SQL常见面试题-1
刚刚走过了金三银四,相信许多小伙伴已经得到了自己心仪的offer,在这里先恭喜大家啦!但可能还有一些小伙伴刚刚开始找工作,作为一名数据分析师,还是想总结一些面试的经验及SQL的笔试面试题给各位小伙伴,希望对大家可以有一些帮助。
今天先总结一些常见的SQL面试题及注意事项,从简到难总结:
一. 列/行转换
1.第一种类型
要点:通过union将不同name对应的学科成绩拆分后合并到一起
语句(可直接复制)
SELECT name,'english' AS subject,english AS score FROM table_1
UNION
SELECT name,'math' AS subject,math AS score FROM table_1
UNION
SELECT name,'music' AS subject,music AS score FROM table_1
2.第二种类型
要点:通过case when将同一学科列拆分成多列,但注意要加sum进行聚合,下面分别展示聚合和未聚合的效果
SELECT
name
,SUM(CASE WHEN subject = 'english' THEN score ELSE 0 END) AS english
,SUM(CASE WHEN subject = 'math' THEN score ELSE 0 END) AS math
,SUM(CASE WHEN subject = 'music' THEN score ELSE 0 END) AS music
FROM table_2
GROUP BY name
未聚合
聚合
二. 格式转换
1.第一种类型
要点:hivesql中可以使用lateral view explode配合split将单元格中的多个值进行拆分多行显示,此例是通过逗号进行分割
SELECT
class,name1
FROM table_3 as tt
LATERAL VIEW EXPLODE(SPLIT(name,','))tt AS name1
2.第二种类型
要点:将多行的数据,按照统一列合并为一行,可以使用group_concat进行拼接
SELECT
class,GROUP_CONCAT(name,',')
FROM table_4
GROUP BY class
三. 查询连续天数大于3天的用户
要点:使用窗口函数排序dense_rank() + 日期相减data_sub()函数,最终使用having count>3的用户
step1:使用dense_rank()进行排序
step2:使用date_sub,并且限制having限制连续登陆次数
SELECT userid,bicoredata.DATEFORMAT(date_sub(bicoredata.DATEFORMAT(log_date),rank_id)),COUNT(1) as cnt
FROM(
SELECT userid,log_date,DENSE_RANK() OVER(PARTITION BY userid ORDER BY log_date) AS rank_id
FROM table_5)t
GROUP BY userid,bicoredata.DATEFORMAT(DATE_SUB(bicoredata.DATEFORMAT(log_date),rank_id))
HAVING cnt >=3
此次的分享就到这里啦,先从几个简单的问题入手,下次会继续分享SQL的相关面试题,希望大家可以尽快找到心仪的offer啦!