hive sql 数组拆分 hive sql rank_hive sql 数组拆分


关注

前些天在网上冲浪的时候看到一个案例咨询,问说世界500强的数据分析要不要去,评论区一片爆炸——“楼主能分享一下文科生怎么转行做数据分析吗??”、“SQL、python这些学起来好痛苦!”我看着屏幕苦笑,数据分析岗位现在的热门程度如果要形容的话,基本就是随便抓一个微博网友都知道这个岗位了。

所以,这么多人感兴趣、想转行、想尝试的岗位,到底该从哪里入手进行准备呢?——dangdangdang~ 当然是SQL啦!

SQL是数据分析师必备技能

大家都知道,找工作之前要看招聘启事的嘛,数据分析师的招聘JD你们一定不陌生:



hive sql 数组拆分 hive sql rank_hive sql 数组拆分_02

可以说,不是每个数据分析岗都要求python,但是每个数据分析岗,都、需、要会SQL。

我曾在滴滴、美团、平安科技的数据分析类岗位实习过,实习期间会大量运用sql进行取数。也参与了2018年的秋招,做过网易、拼多多、新浪等等公司的数据分析笔试题,还是比较了解SQL常考的题目类型的。

我不是技术大神,但是我——会抓重点!

写这篇文章是希望帮助还没有实战过SQL的小伙伴、或者了解一些SQL语句、但是担心自己了解的太片面的小伙伴,帮助你们了解:如果想要面试数据分析岗位,最优先需要掌握的SQL技能是哪些呢?

读完本文,你能快速知道:

(1)除了select 这种基本的语句,我最应该马上掌握的SQL语句和知识是什么?

(2)面试中SQL题80%都在考察的语法是什么?

(3)这些语法应该怎么使用?

SQL基础知识介绍

本文将从三大块介绍入门SQL需要掌握的语法和知识,分别是:查询,包括最基础的选择(select)和连接(join/union);最常用的语法(distinct/group by/order by等);一些小小的取数技巧(组内排序、取前百分之多少的值、时间函数)。

介绍完了三大块知识后,后面会有常见的SQL面试/笔试题,可以练习和交流。接下来让我们开始吧~



hive sql 数组拆分 hive sql rank_sql server cast函数_03

一、最基本(选数据)

1. 从某张表选一列数据
## 从table_1中选择a这一列
select a from table_12. 从多张表里,取多个字段
## table_1中有id,age; table_2中有id,sex。
## 想取出id,age,sex 三列信息
##将table_1,table_2 根据主键id连接起来
select a.id,a.age,b.sex from (select id,age from table_1) a  
join (select id, sex from table_2) b 
on a.id =b.id

3. 介绍一下几种join(敲重点,很容易问的哦)

(1)join : hive的join默认是inner join,找出左右都可匹配的记录;

(2)left join: 左连接,以左表为准,逐条去右表找可匹配字段,如果有多条会逐次列出,如果没有找到则是NULL;

(3)right join:右连接,以右表为准,逐条去左表找可匹配字段,如果有多条会逐次列出,如果没有找到则是NULL;

(4)full outer join: 全连接,包含两个表的连接结果,如果左表缺失或者右表缺失的数据会填充NULL。

4. 两张表数据的字段一样,想合并起来

## 合并两张表的数据
select * from
 (select id from table_1 
UNION ALL
select id from table_2) t

注:union和union all 均基于列合并多张表的数据,所合并的列格式必须完全一致。union的过程中会去重并降低效率,union all 直接追加数据。union 前后是两段select 语句而非结果集

二、最常用(不是用这个就是用那个,更有可能多重组合)

1. 去重:distinct

## 罗列不同的id
select distinct id from table_1

2. 统计:count/max/avg/sum等

## 统计不同的id的个数
select count(distinct id) from  table_1

3. 按某维度进行统计:group by

## 统计不同性别(F、M)中,不同的id个数
select count(distinct id) from table_1
group by sex
## 其它的聚合函数例如:max/min/avg/sum
## 统计最大/最小/平均年龄
select max(age), min(age),avg(age)
 from table_1
group by id

4.筛选:where/having

## 统计A公司的男女人数
select count(distinct id) from table_1
where company = 'A'
group by sex
## 统计各公司的男性平均年龄,并且仅保留平均年龄30岁以上的公司
select company, avg(age) from table_1
where sex = 'M'
group by company
having avg(age)>30;

5. 排序:order by

## 按年龄全局倒序排序取最年迈的10个人
select id,age from table_1 
order by age 
DESC 
limit 10

6. 条件函数:case when /if

## 将salary按一定规则分组
select id, 
case when salary <50000 Then '0-5w'
when salary >=50000 and salary<100000 then '5w-10w'
when salary >=100000 and salary <200000 then '10w-20w'
when salary >200000 then '20w+'
else NULL end 
from table_1;

注:case 函数的格式为(case when 条件1 then value1 else null end), 其中else 可以省,但是end不可以省。

7.字符串函数:concat/substr

## concat( A, B...)返回将A和B按顺序连接在一起的字符串
select concat('www','.iteblog','.com') from table1;
## 得到 www.iteblog.com
## substr(str,0,len) 截取字符串从0位开始的长度为len个字符
select substr('abcde',3,2) from table1;

SQL基础进阶:常用函数

1 . 排序:row_number/rank/dense_rank

## 按照字段salary倒序编号
select *, row_number() over (order by salary desc) as row_num from table_1;
## 按照字段deptid分组后再按照salary倒序编号
select *, row_number() over (partition by deptid order by salary desc) as rank from table_1;

2. 获取topN%的值:percentile

## 获取income字段的top10%的阈值
select percentile(CAST (salary AS int),0.9)) as income_top10p_threshold from table_1;
## 获取income字段的10个百分位点
select percentile(CAST (salary AS int),
array(0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0)) as income_percentiles from table_1;

3. 日期函数:to_date/date_diff等

## 转换为时间数据的格式
select  to_date("1970-01-01 00:00:00") 
as start_time from table_1;
## 计算数据到当前时间的天数差
select datediff('2016-12-30','2016-12-29');

习题实战

纸上得来终觉浅,绝知此事要躬行。

让我们来看看实际的SQL练习题:

背景:

有3个表S,C,SC:

S(SNO,SNAME)代表(学号,姓名)
C(CNO,CNAME,CTEACHER)代表(课号,课名,教师)
SC(SNO,CNO,SCGRADE)代表(学号,课号,成绩)

问题:

1,找出没选过“黎明”老师的所有学生姓名。

2,列出2门以上(含2门)不及格学生姓名及平均成绩。

3,既学过1号课程又学过2号课所有学生的姓名。

(1)考察条件筛选  

select sname from s where sno 
not in ( select sno from sc where cno in
  (select distinct cno from c where cteacher='黎明'
  ));

(2)考察聚合函数,条件筛选

select s.sname, avg_grade from s
join 
(select sno from sc where scgrade < 60 
group by sno 
having count(*) >= 2) t1
on s.sno = t1.sno
join(select sno, avg(scgrade) as avg_grade from sc group by sno ) t2
on s.sno = t2.sno;3.

(3)考察筛选、连接

select sname from s
where sno=(select a.sno from( select sno from sc where cno = 1) a
join (select sno from sc where cno = 2) b
on a.sno = b.sno)

此外,在网上有大量的sql练习题,我当初是通过w3schools上手的:

https://www.w3school.com.cn/

还有牛客网上也有大量练习题。

https://www.nowcoder.com/

提醒一下大家,做SQL题的时候一定要注意理解每个题目希望你用的是什么知识点,这样有助于巩固。

在写这篇文章之前,我也看过网上关于SQL学习的文章,有的比较广泛而全面,有的则太过干货,全部是牛客上的SQL题目的解析。

基于自己的体会,我写了这篇SQL面试和笔试的入门文章,主旨是快速、清晰的把握重点。配合适当练习,基本上两天时间就可以学会了!所谓天下武功,唯快不破,希望大家都能快快入门SQL~