之前写过一篇sql的文章,面向基础的sql操作(无眠:数据分析面试必备——SQL你准备好了吗?),目前已经有12000+收藏(收藏是点赞的5倍,你们可真狠心哪),也可以看出众多同学对sql学习的热情。但是这篇文章的评论区也有很多声音说,想看sql的进阶知识(例如:窗口函数)担心只掌握基本的sql查询不能cover到工作的方方面面。所以我又来啦!

上篇sql基础主要讲了以下内容:

SQL查询-基础篇

本次sql主要会讲以下这四类常用函数:

SQL查询-函数篇

这些函数可以帮助我们将复杂的查询简单化,我有遇到小伙伴对排序很迷茫,或者是错位取数不知道怎么取。这些原因都是因为你不清楚hive里面有内嵌的函数可以直接使用,当你清楚的知道了函数都分别可以帮助你做到怎样的事情,hive sql写起来就会轻松很多了

读完本文,你会知道:

(1)hive sql进行查询过程中90%你觉得棘手的问题其实可以通过函数解决;

(2)如果你想学习hive sql里使用的函数,你应该学习哪些?

(3)这些函数分别可以怎样帮助我?具体怎么写呢?

OK,接下来让我们进入正题。(注:本文所有示例结果都经本人实际操作使用hive运行得出

一、查询分析的利器——窗口函数

开篇就得讲窗口函数,因为窗口函数有个很明显的特点:不知道它的时候,完全不知道怎么写sql取到自己想要的数;知道了以后,就恍然大悟:“原来可以这么写啊!”所以我给它起名叫,查询分析的利器。

1. 窗口排序

row_number/rank/dense_rank

窗口函数当然是这篇文章的重点了。窗口函数中,排序函数又是最常用到的。

窗口排序主要是指非全局排序,需要在某个维度下进行排序。进入这part之前,先建个临时表来帮助理解。例如说现在想看各个department内部cost最多的人,这时候不能全局order by了,该怎么取?

select

分组排序的结果

row_number() 则在排序相同时不重复,会根据顺序排序。

rank()排序相同时会重复,总数不会变 ,意思是会出现1、1、3这样的排序结果;

dense_rank() 排序相同时会重复,总数会减少,意思是会出现1、1、2这样的排序结果。

2. 分区最大/最小值

first_value/last_value取的是分组内排序后,截止到当前行第一个/最后一个值

select

最后就会得到每个组里的cost最多和最少的人:

分组取最大/最小值的结果

3. 累积百分比

cume_dist / sum() over

累积百分比的应用场景也很多,比如说,想看前XX%的用户贡献了XX%的总额。

这个地方需要两个函数的使用,1是XX%的用户,2是XX%的总额。

select

cume_dist返回的是小于等于当前值的行数/分组内总行数,但我倒序排的话,也就是大于等于了。sum()over是算的累积值的占比。

但A组这种无重复值的,结果是很好理解的。最后可以得到A部门的cost由高到低排序,XX%的人累积贡献了XX%多少。

PS. 不过我用sum()over的时候发现一个小问题,就是如果cost有两个相同的值,会出现他们的cume_dist返回值和sum()over返回值是一样的,并没有累积去算,比如说B组cost为100的两个人,他们是并列倒数第一,这个时候,cume_dist和sum over都返回的是1,这个部分我目前还没有特别明白这种情况怎么处理。继续查阅再看。

4. 错位

lead/lag函数

lead和lag函数,这两个函数一般用于计算差值,最适用的场景是计算花费时间。举个例子,有数据是每个用户浏览网页的时间记录,将记录的时间错位之后,进行两列相减就可以得到每个用户浏览每个网页实际花费的时间。

lead是用于统计窗口内往下第n行值,lag是用于统计窗口内往上第n行值。

虽然目前我们这个数据不是时间数据,也可以使用这个函数操作一下。例如说,现在计算按cost排序后,每个department的人他们的花费,以及和比他们花费排名更高一名的人的值,可以计算差值。

select 

二、必须掌握的日期函数

日期函数,主要是靠表示日期类型的花样繁多来让我们觉得复杂。个人觉得我们不需要记住太多细碎的日期函数,因为当我们取数据表中的数据时,一般都是存好了的日期或时间戳,我们只需要记得:几种常见的日期格式中,怎么转换、怎么加减,得到我们需要的日期。

几种常见的日期格式

1. 日期(2020-03-21 17:13:39)和unix时间戳(1584782175)之间怎么相互转换

当你存储的是日期,希望转化为UNIX时间戳时,使用unix_timestamp函数,命令格式:unix_timestamp(string date, string pattern) ,表示转换pattern格式的日期到时间戳
当你存储的是时间戳,希望转化为日期,使用from_unixtime函数,命令格式:from_unixtime(bigint unixtime, [string format])

## 

需要注意的是:

unix_timestamp(string date)默认转换格式为"yyyy-MM-dd HH:mm:ss"的日期;如果格式不对,例如说你直接用unix_timestamp('20200321')会得到NULL的~~

如果自己有特定希望转换的日期格式,需要使用unix_timestamp(string date, string pattern)转换pattern格式的日期。比如说,unix_timestamp('20200321','yyyyMMdd') 就可以得到 1584720000了~

2. 日期(2020-03-21 17:13:39)怎么转换为想要的格式(2020-03-21)

可以直接使用to_date函数,也可以使用字符串提取函数。

select 

3. 日期之间怎么进行加减操作?

使用datesub/date_add/datediff函数

## 

需要注意的是,datediff函数只能处理'yyyy-MM-dd'这种格式的日期,如果日期形式是'yyyyMMdd'的话,需要用上面提到的日期和日期格式之间的转换方法来做处理~

三、最常碰见的字符串函数

1. 字符串的提取

使用substr/substring函数

## 

2. 字符串的拼接

使用concat/concat_ws函数

## 

3. 字符串的常见处理函数:length/trim/lower/upper

## 

4. 不同格式数据的转换:cast

## 

5. 偶尔也需要用到正则表达式

regexp_extract 提取 / regexp_replace 替换

##  

6.字符串解析

get_json_object

## 

四、其他常用函数

1. 行列转换

lateral view explode

比如说,当遇到一个用户在很多个实验组,每个user_id对应的ab_version字段存储是这样的:

这个时候,你希望找到某个abversion的user_id,就需要把一行转换为很多行,每行后面都带有某个实验组的标志。

select 

2. 随机抽样

rand(),rand(int seed)

从数据中随机抽取一些样本,使用rand函数,会返回一个0到1范围内的随机数。如果指定种子seed,则会等到一个稳定的随机数序列

## 

至此,基本常用到的函数就介绍完毕了。

不同于上篇基础的SQL入门,写这篇文章的原因是希望大家能对SQL内置的函数有个概念,知道当自己遇到什么样的查询问题时,可以选择进行检索查询是否有对应解决的函数,而不是使用特别笨拙的方法去进行取数

希望大家看完有收获,点赞是对创作者最大的鼓励~(一本正经的鞠躬

关注就更好了,可以持续看更新~

参考:

Hive 分析函数lead、lag实例应用

hive 日期函数_数据分析面试必备——SQL窗口函数你会了吗?相关推荐

  1. server sql 分组 去重 字符串拼接_SQL | 数据分析面试必备SQL语句+语法

    | 作者:无眠 | 来源:知乎 前些天在网上冲浪的时候看到一个案例咨询,问说世界500强的数据分析要不要去,评论区一片爆炸:"楼主能分享一下文科生怎么转行做数据分析吗??".&qu ...

  2. SQL | 数据分析面试必备SQL语句+语法

    关注上方"小詹学Python",选择"星标公众号", 关键时间,第一时间送达! | 作者:无眠 | 来源:知乎 前些天在网上冲浪的时候看到一个案例咨询,问说世界 ...

  3. hive substr函数_数据分析工具篇——HQL函数及逻辑

    本篇文章我们梳理一下hive常用的函数,对于hive而言,常用的函数并不是特别多,往往记住关键几个,就可以解决80%的问题,这也是大家喜欢hive的原因,那么,常用的函数有哪些呢? 时间函数 1)时间 ...

  4. 【hive 日期函数】Hive常用日期函数整理

    1.to_date:日期时间转日期函数 select to_date('2015-04-02 13:34:12'); 输出:2015-04-02 1 2 2.from_unixtime:转化unix时 ...

  5. 【hive 日期函数 大全】Hive常用日期函数整理 史上最全

    [hive 日期函数 大全]Hive常用日期函数整理注意:1) hive 没有 to_char函数 2) HIVE 日期函数只识别 年-月-日 不能识别 年-月 ,所以处理月份的时候需要特殊处理1)h ...

  6. hive日期函数总结

    Hive 日期函数 Hive Date Functions 官网地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+U ...

  7. Hive日期函数使用

    Hive日期函数使用 year month day hour minute second add_months date_add date_sub date_format datediff dayof ...

  8. hive日期函数使用大全

    以下hive日期函数百分百满足日常工作使用,请仔细阅读!! [hive 日期函数 大全]Hive常用日期函数整理注意:1) hive 没有 to_char函数 2) HIVE 日期函数只识别 年-月- ...

  9. hive sql练习_SQL语句+语法 I 数据分析面试必备

    - 点击上方"中国统计网"订阅我吧!- 前些天在网上冲浪的时候看到一个案例咨询,问说世界500强的数据分析要不要去,评论区一片爆炸:"楼主能分享一下文科生怎么转行做数据分 ...

最新文章

  1. dmalloc 原文 翻译整理
  2. php怎么获取手机屏,使用PHP获得屏幕分辨率
  3. 数据结构-双向链表的实现
  4. Go语言 goroutine
  5. s5pv210 linux内核移植,简单根文件系统制作 - S5PV210 Linux3.8.3内核移植_Linux编程_Linux公社-Linux系统门户网站...
  6. VC++ 中ListCtrl经验总结
  7. jQuery的get()和post()方法
  8. C++:常用数据类型及常见操作
  9. Crontab 使用(转)
  10. Cisco无线AP的配置
  11. ARM汇编指令(ARM寻址方式、汇编指令、伪指令
  12. 【报告分享】2022全面数字化发展下的消费市场洞察.pdf(附下载链接)
  13. python 一个简单的天气预报程序
  14. 【Android 界面效果13】关于全屏和取消标题栏
  15. XLua访问C#中的List或者数组
  16. 如何使用“启动转换”从 Mac 上移除 Windows?
  17. LINUX下载编译sqlite-jdbc的jar包
  18. kb2919355无法安装
  19. pdf转word好用的软件
  20. c语言向量乘法,运用C语言实现向量积

热门文章

  1. python 中 enumerate() 函数使用
  2. opencv学习第6课官方练习实现 Create a Paint application with adjustable colors and brush radius using trackbars
  3. Python实现对于文件的分类
  4. Python:Numpy库中的invert()函数的用法
  5. redmine 自己定义字段mysql表结构
  6. 痴情研究java内存中的对象
  7. sql 的 DATE_FORMATE()函数
  8. 基于Altium Designer的4层PCB板的绘制
  9. [转载] C++11初始化列表与参数列表的作用
  10. Python练习之购物车