hive中求相邻时间问题的两种解决方法
标签: hive
hive中经常会有求连续数字或者连续的时间这种问题,其实处理的方法一致。
首先给出数据的结构:
假如表dw.tmp_interview_data中存放有如下样式的数据:
求出表dw.tmp_interview_data中每个人连续工作时间段及对应的工资和,结果表如下:
姓名 |
开始日期 |
结束日期 |
总工资 |
小明 |
2017-06-01 |
2017-06-03 |
300 |
小红 |
2017-06-01 |
2017-06-03 |
240 |
小明 |
2017-07-01 |
2017-07-01 |
150 |
小明 |
2017-08-02 |
2017-08-03 |
200 |
此种为题可以归类为求连续时间的问题(求连续数字是相同的解决办法),现给出两种解决办法。
第一种:
SELECT a.name
,b.starttime
,b.endtime
,sum(case when a.date>=b.starttime and a.date<=b.endtime then a.salary else 0 end) as total_salary
FROM dw.tmp_interview_data a
LEFT JOIN
( SELECT name
,diff
,qujian[0] endtime
,case when diff=0 then qujian[0]
when diff=1 then qujian[1]
when diff=2 then qujian[2]
when diff=3 then qujian[3] end as starttime --此处如有其它时间差,需要进行枚举
FROM --取出连续时间范围
( SELECT name
,datediff(max(date),min(date)) diff
,COLLECT_set(date) qujian
FROM --求出连续时间之差
( SELECT name
,date
,salary
,date_sub(date,rank) as date2
FROM --日期与排名之间的差值
( SELECT name
,date
,salary
,row_number () over (partition by name order by date) rank
FROM dw.tmp_interview_data --按name分组后对date进行排序
) a
) a
GROUP BY name,date2
) a
) b on a.name=b.name
GROUP BY a.name,b.starttime,b.endtime
运行结果如下:
第二种方法:
SELECT name
,first1
,last1
,salary * (datediff(last1, first1)+1) as salary
FROM
( SELECT name
,num
,salary
,min(date) as first1
,max(date) as last1
FROM
( SELECT a.name
,a.date
,date_sub(date, rn - 1) num
,salary
FROM
( SELECT name
,date
,salary
,row_number() over(PARTITION BY name ORDER BY date) rn
FROM dw_htlbizdb.tmp_qh_liu_interview_data
GROUP BY name,date,salary
) a
) b group by name,num,salary
) a
运行结果如下:
其实两种方法比较下来,都先先用row_number()函数通过name分组,并对日期进行排序,然后利用日期与所得排名之间的差值来做进一步的处理。连续数字问题思路同上~
智能推荐
【Network Security!】信息的扫描与嗅探
文章目录 确定扫描目标 确定目标主机IP地址 网站架构探测 确定扫描目标 确定目标主机IP地址 1.获取本机IP地址 2.获取网站地址信息 3.获取指定网站的IP地址 4.确定可能开放的端口和服务 Zenmap是一款非常流行的端口扫描软件(nmap的GUI界面化)。它是用Python语言编写而成的开源的图形界面,能够运行在不同操作系统平台上(Windows/Linux/Unix/Mac OS)) ...
太赞了!Linux 架构师总结的学习笔记,提供下载
本文字数:1247,阅读时长大约:1分钟 导读:你想学习 Linux 吗? 最近很多小伙伴找我要一些 Linux 基础资料,于是我翻箱倒柜,把这份技术大牛总结的 Linux 归纳笔记找出来,免费共享给大家! 据说有小伙伴靠这份笔记顺利进入 BAT 哦,所以一定要好好学习这份资料! 资料介绍 这份资料非常全面且详细,从 Linux 常用命令到 Linux 常用操作,再到shell编程、...
【底层原理】高级开发必须懂的"字节对齐"
认识字节对齐之前,假定int(4Byte),char(1Byte),short(2Byte) 认识字节对齐 先看段代码: sizeof(Data1)和sizeof(Data2)分别表示Data1和Data2内存占用字节数,输出结果不一样是因为编译时对Data1和Data2做了不同的字节对齐。Data1的对齐为4Byte,Data2的对齐是2Byte。 假定存储起始地址为...
爬lol全英雄皮肤
初学爬虫简单的爬取一下lol全英雄皮肤,自己写的,和网上CV的好不一样,觉得文章说得过去的记得留下足迹。 一 分析页面 1.英雄列表 首先在英雄页面找到hero_list.js;至于为什么是这个文件,看图: 观察该文件响应头,获取访问的url,打开新的窗口,访问该链接,能获取对应数据。(这边显示在一行很男查看,推荐一款好用的chrome插件JSONView,可以帮帮我们格式化json数据,可以在g...
解决VUE项目重复点击菜单报错:Avoided redundant navigation to current location: “/xxxxx“. 问题
描述: 报错见下图: 解决方法: 在router文件夹下添加下面一段代码...
猜你喜欢
Nginx 入门指南(十)
负载均衡模块 负载均衡模块用于从upstream指令定义的后端主机列表中选取一台主机。Nginx 先使用负载均衡模块找到一台主机,再使用 upstream 模块实现与这台主机的交互。为了方便介绍负载均衡模块,做到言之有物,以下选取 Nginx 内置的 ip hash 模块作为实际例子进行分析。 配置 要了解负载均衡模块的开发方法,首先需要了解负载均衡模块的使用方法。因为负载均衡模块与之前书中提到的...
文本和输入:复制和粘贴
Android提供了一个功能强大的基于剪贴板的复制和粘贴框架。 它支持简单和复杂的数据类型,包括文本字符串,复杂数据结构,文本和二进制流数据,甚至应用程序资产。 简单的文本数据直接存储在剪贴板中,而复杂数据则作为粘贴应用程序与内容提供者解析的参考进行存储。 复制和粘贴在应用程序中以及在实现框架的应用程序之间工作。 由于框架的一部分使用内容提供者,因此本主题假定您熟悉Android内容提供程序API...
[unity]代码批量修改图片、文本文件的AssetBundle的Name
当项目工程内有大量文件,需要打包成AssetBundle的时候,一个一个打包是一件非常麻烦的事情。 批量修改AssetBundle的Name并对AssetBundle包 进行批量 打包。 批量修改项目工程文件的图片、文本文件的AssetBundle 1.批量建立AssetBundle 1.1修改文件的.meta文件的文本内容 来自参考资料1 ...
[Python] 用K-means算法进行客户分群
目录 一、背景 1.项目描述 2.数据描述 二、相关模块 三、数据可视化 1.数据读取 2.数据可视化 2.1 平行坐标图 2.2 年龄/年收入/消费分数的分布 2.3 年龄/年收入/消费分数的柱状图 2.4 不同性别用户占比 2.5 两两特征之间的关系 2.6 两两特征之间的分布 四、K-means聚类分析 0.手肘法简介 1.基于年龄和消费分数的聚类 2.基于年收入和消费分数的聚类 3.基于年...
CUDA9.0+win10+Visual Studio2017版本配置安装教程
CUDA9.0+win10+Visual Studio2017版本配置安装教程 不幸掉入深度学习的深渊,从此以后无法自拔,哈哈,虽然电脑属于平民配置,但因为有师姐顶配DELL工作站的操练,可以肆无忌惮的配置安装自己想要的东西,一路踩坑,一路爬,一把辛酸泪。安装的时候特别要注意VS和CUDA版本的兼容问题,否则要么卸载重装,要么一系列的路径操作会让你绝望。 如果电脑配置够新,不妨试试安装最新版本的C...