ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

hive SQL 初学者题目,实战题目 字符串函数,日期拼接,开窗函数。。。。

2022-06-07 22:01:42  阅读:244  来源: 互联网

标签:题目 函数 hive select cost 2018 time date concat



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,select,cost,2018,time,date,concat
来源: https://www.cnblogs.com/liudehaos/p/16353552.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有