hive SQL 初学者题目,实战题目 字符串函数,日期拼接,开窗函数。。。。
sql:Hive实现按照指定格式输出每七天的消费平均数
输出格式:
2018-06-01~2018-06-07 12.29
...
2018-08-10~2018-08-16 80.67
答案:
-- 1、先将日期进行切分得到年月日
select split(date_time,'/'),cost from f;
将日期格式转换成上面的格式
select concat_ws('-',split(date_time,'/')),cost from f;
-- 按照每七天进行分区
select datediff(concat_ws('-',split(date_time,'/')),'2018-06-01'),cost from f;
select floor((datediff(concat_ws('-',split(date_time,'/')),'2018-06-01'))/7),cost from f;
-- 转换成int 类型,进行数值运算
select cast(floor((datediff(concat_ws('-',split(date_time,'/')),'2018-06-01'))/7)*7 as int),cost from f;
得到每七天的起始日期
select date_add('2018-06-01',cast(floor((datediff(concat_ws('-',split(date_time,'/')),'2018-06-01'))/7)*7 as int)),cost from f;
得到每七天的结束日期
select date_add('2018-06-01',cast(floor((datediff(concat_ws('-',split(date_time,'/')),'2018-06-01'))/7)*7+6 as int)),cost from f;
将两个日期进行拼接得到:2018-06-01~2018-06-07
select concat(date_add('2018-06-01',cast(floor((datediff(concat_ws('-',split(date_time,'/')),'2018-06-01'))/7)*7 as int)),'~',date_add('2018-06-01',cast(floor((datediff(concat_ws('-',split(date_time,'/')),'2018-06-01'))/7)*7 as int)+6)) as dtime,cost from f;
-- 分组,求平局值
select w.dtime,round(avg(w.cost),2) avg_cost from (select concat(date_add('2018-06-01',cast(floor((datediff(concat_ws('-',split(date_time,'/')),'2018-06-01'))/7)*7 as int)),'~',date_add('2018-06-01',cast(floor((datediff(concat_ws('-',split(date_time,'/')),'2018-06-01'))/7)*7 as int)+6)) as dtime,cost from f) w group by w.dtime ;
数据如下:
2018/6/1,10
2018/6/2,11
2018/6/3,11
2018/6/4,12
2018/6/5,14
2018/6/6,15
2018/6/7,13
2018/6/8,37
2018/6/9,18
2018/6/10,19
2018/6/11,10
2018/6/12,11
2018/6/13,11
2018/6/14,12
2018/6/15,14
2018/6/16,15
2018/6/17,13
2018/6/18,17
2018/6/19,18
2018/6/20,19
2018/6/21,20
2018/6/22,21
2018/6/23,21
2018/6/24,22
2018/6/25,24
2018/6/26,25
2018/6/27,23
2018/6/28,27
2018/6/29,28
2018/6/30,29
2018/7/1,40
2018/7/2,41
2018/7/3,41
2018/7/4,42
2018/7/5,44
2018/7/6,45
2018/7/7,43
2018/7/8,47
2018/7/9,48
2018/7/10,49
2018/7/11,50
2018/7/12,51
2018/7/13,51
2018/7/14,52
2018/7/15,54
2018/7/16,55
2018/7/17,53
2018/7/18,57
2018/7/19,58
2018/7/20,59
2018/7/21,30
2018/7/22,31
2018/7/23,31
2018/7/24,32
2018/7/25,34
2018/7/26,35
2018/7/27,33
2018/7/28,37
2018/7/29,38
2018/7/30,39
2018/7/31,70
2018/8/1,71
2018/8/2,71
2018/8/3,72
2018/8/4,74
2018/8/5,75
2018/8/6,73
2018/8/7,77
2018/8/8,78
2018/8/9,79
2018/8/10,80
2018/8/11,81
2018/8/12,81
建表语句:
create table f
(
date_time string,
cost string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
标准答案:
1、先将日期进行切分得到年月日
select split(date_time,'/'),cost from f;
2、将切分出来的年月日使用'-'进行连接,使用concat_ws
select concat_ws('-',split(date_time,'/')),cost from f;
3、主要实现的思路是将每7天分成一组,问题就是如何实现统一分组,首先我可以将每个日期对6月1号做减法,得到间隔的日期
datediff
select datediff(concat_ws('-',split(date_time,'/')),'2018-6-1'),cost from f;
4、在上面得到间隔天数之后,进行除以7,floor向下取整,得到整数部分
select floor(datediff(concat_ws('-',split(date_time,'/')),'2018-6-1')/7),cost from f;
5、现在需要思考的问题是,怎么转化成最终结果的日期格式?而且还必须是7天为一组的现象,
select date_add('2018-6-1',cast(floor(datediff(concat_ws('-',split(date_time,'/')),'2018-6-1')/7)*7 as int)),cost from f;
6、现在需要考虑的问题是如何获取的7天后的日期,以及输出的格式怎么定义,通过观察上一步的结果发现,在当前的日期基础上加上6就是一周的结束时间
,然后使用字符串拼接函数进行拼接得到最终结果
select concat(date_add('2018-6-1',cast(floor(datediff(concat_ws('-',split(date_time,'/')),'2018-6-1')/7)*7 as int)),'~',date_add('2018-6-1',cast(floor(datediff(concat_ws('-',split(date_time,'/')),'2018-6-1')/7)*7+6 as int))) as dtime,cost from f;
7、分组求平均值
select w.dtime,avg(w.cost) from (select concat(date_add('2018-6-1',cast(floor(datediff(concat_ws('-',split(date_time,'/')),'2018-6-1')/7)*7 as int)),'~',date_add('2018-6-1',cast(floor(datediff(concat_ws('-',split(date_time,'/')),'2018-6-1')/7)*7+6 as int))) as dtime,cost from f) w group by w.dtime;
8、四舍五入,保留两位小数
select w.dtime,round(avg(w.cost),2) from (select concat(date_add('2018-6-1',cast(floor(datediff(concat_ws('-',split(date_time,'/')),'2018-6-1')/7)*7 as int)),'~',date_add('2018-6-1',cast(floor(datediff(concat_ws('-',split(date_time,'/')),'2018-6-1')/7)*7+6 as int))) as dtime,cost from f) w group by w.dtime;
列出每个部门薪水前两名最高的人员名称以及薪水。(思考:用开窗函数解决)
select deptno,ename,sal,row_number() over(partition by deptno order by sal desc) as paixu from emp;
select t1.* from (select empno,deptno,ename,sal,row_number() over(partition by deptno order by sal desc) as paixu from emp ) t1 where t1.paixu<3;
select w.empno,w.ename,w.sal,w.deptno,w.rn from (select empno,ename,sal,deptno,row_number() over(partition by deptno order by sal desc) as rn from emp) w where w.rn<3;
hive SQL 初学者题目,实战题目 字符串函数,日期拼接,开窗函数。。。。的更多相关文章
- SQL Server聚合函数与聚合开窗函数 (转载)
以下面这个表的数据作为示例. 什么是聚合函数?聚合函数:聚合函数就是对一组值进行计算后返回单个值(即分组).聚合函数在计算时都会忽略空值(null).所有的聚合函数均为确定性函数.即任何时候使用一组相 ...
- SQL Server聚合函数与聚合开窗函数
以下面这个表的数据作为示例. 什么是聚合函数? 聚合函数:聚合函数就是对一组值进行计算后返回单个值(即分组).聚合函数在计算时都会忽略空值(null). 所有的聚合函数均为确定性函数.即任何时候使用一 ...
- sql server 系统常用函数:聚合函数 数学函数 字符串函数 日期和时间函数和自定义函数
一.系统函数 1.聚合函数 聚合函数常用于GROUP BY子句,在SQL Server 2008提供的所有聚合函数中,除了COUNT函数以外,聚合函数都会忽略空值AVG.COUNT.COUNT_BIG ...
- SQL Server排名函数与排名开窗函数
什么是排名函数?说实话我也不甚清楚,我知道 order by 是排序用的,那么什么又是排名函数呢? 接下来看几个示例就明白了. 首先建立一个表,随便插入一些数据. ROW_NUMBER 函数:直接排序 ...
- Spark(十三)SparkSQL的自定义函数UDF与开窗函数
一 自定义函数UDF 在Spark中,也支持Hive中的自定义函数.自定义函数大致可以分为三种: UDF(User-Defined-Function),即最基本的自定义函数,类似to_char,to_ ...
- sql:日期操作注意的,如果以字符串转日期时的函数,因为数据量大,会出问题
---1.以日期字符操作转换日期 如果是VIP1生日不对,可以以上传的数据日期为生日 begin declare @NowBirthday datetime, @birthday datetime,@ ...
- 【SQL学习笔记】排名开窗函数,聚合开窗函数(Over by)
处理一些分组后,该组按照某列排序后 ,取其中某条完整数据的问题. 或 按照其中不同列分组后的聚合 比如 sum,avg之类. MSDN上语法: Ranking Window Functions < ...
- hive常用函数 wordCount--Hive窗口函数1.1.1 聚合开窗函数聚合开窗函数实战
第三天笔记 第三天笔记 SQL练习Hive 常用函数关系运算数值计算条件函数日期函数重点!!!字符串函数Hive 中的wordCount1.1 Hive窗口函数1.1.1 聚合开窗函数聚合开窗函数实战 ...
- Hive SQL 分类
题目: 请使用Hive SQL实现下面的题目. 下面是一张表名为user_buy_log的表,有三个字段,user(用户),grp(分组编号),time(购物时间). 需要将用户按照grp分组,对ti ...
随机推荐
- 一条更新的SQL如何执行
开源Linux 一个执着于技术的公众号 一条SQL的执行流程如图所示 如图所示:MySQL数据库主要分为两个层级:服务层和存储引擎层 •服务层:server层包括连接器.查询缓存.分析器.优化器.执行 ...
- 【Python情感分析】用python情感分析李子柒频道视频热门评论
一.事件背景 今天是2021.12.2日,距离李子柒断更已经4个多月了,这是我在YouTube李子柒油管频道上,观看李子柒2021年7月14日上传的最后一条视频,我录制了视频下方的来自全世界各国网友的 ...
- Git使fork项目与源项目保持一致
操作如下: 1.先clone自己的fork项目到本地工程目录 git clone git@gitlab.alibaba-inc.com:riqi/{project}.git 2.进入该项目目录 ...
- 爬虫Ⅱ:scrapy框架
爬虫Ⅱ:scrapy框架 step5: Scrapy框架初识 Scrapy框架的使用 pySpider 什么是框架: 就是一个具有很强通用性且集成了很多功能的项目模板(可以被应用在各种需求中) scr ...
- 「POI2012」井 Well
description 你要挖井,\(n\)个地面的高度可视为\(h_i\),每次操作你可以将一个\(h_i-1\),你最多可执行\(m\)次操作. 你要任选其中一个\(h_i\)挖到\(0\),问你 ...
- JDK1.7HashMap源码分析
1.1首先HashMap中的Hash(哈希)是什么? Hash也称散列,哈希,对应的英文都是Hash.基本原理就是把任意长度的输入通过Hash算法变成固定长度的输出,这个映射的规则就是对应的Ha ...
- JS:||运算符
||逻辑运算符 ||这个符号在开发中 往往是优化的代码最常用的js符号: 当用||连接语句时,回将前后语句变为Boolean类型,再进行运算: 1.当||前面条件为false,不管后面是true/fa ...
- css做旋转相册效果
css做旋转相册效果 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...
- SAP Web Dynpro-版本管理
您可以使用版本管理来管理对象的旧版本,比较版本,也可以重置它们. 在版本管理中,您可以存储ABAP开发对象的不同版本. 在ABAP工作台中,您可以比较不同版本的- 视图 视窗 控制器 您也可以存储对象 ...
- SAP -SE30 程序运行时间分析
运行SE30 选中Program,点击Excute 点击运行 分析结果