Hive分组取第一条记录
需求
交易系统,财务要求维护每个用户首个交易完成的订单数据(首单表,可取每个用户交易完成时间最老的订单数据)。举例:
简写版的表结构:

表数据:

则 财务希望汇总记录如下:
| uid | order_id | service_completion_time |
|---|---|---|
| 2 | 44 | 2017-02-03 12:23:01.0 |
| 3 | 33 | 2017-11-30 12:23:01.0 |
hive分组排序函数
语法:row_number() over (partion by fieldA order by fieldB desc) rank
含义:表示根据fieldA分组,在分组内部根据fieldB排序,而row_number() 函数计算的值就表示每组内部排序后的行编号(该编号在组内是连续并且唯一的)。
注意: rank 在这里是别名,可任意
partition by:类似于Hive的建表,分区的意思。
order by : 排序,默认是升序,加desc降序。
需求实现
汇总首单:
select * from (
select
uid , order_id ,service_completion_time ,
row_number() over ( partition by uid order by service_completion_time asc ) num
from
dj_mart_zfpt.test
) last
where last.num = 1 ;
按uid分组,服务完成时间排序,给每个用户的订单编号。编号最新的(也就是1)就是该用户的首单。
分批汇总:
由于订单越来越多,所以每次不可能全量汇总,为了性能考虑,可以汇总每天每个用户当天的首单,然后往历史首单表插入,如果该uid在历史首单表里已存在,就不插入;否则,说明是该用户真正的首单,则录入历史首单表。
实现:
可以通过历史首单表与本日首单表做右连接或者左连接来插入新的首单记录到历史首单表:
右连接文氏图:

insert into table dj_mart_zfpt.t_trade_new_customer
select new.* from dj_mart_zfpt.t_trade_new_customer old right join (
select * from (
select
uid , order_id ,service_completion_time ,
row_number() over ( partition by uid order by service_completion_time asc ) num
from
dj_mart_zfpt.test
) last where last.num = 1
) new on old.uid = new.uid where old.uid is null;
Hive分组取第一条记录的更多相关文章
- MongoDB 聚合分组取第一条记录的案例及实现
关键字:MongoDB: aggregate:forEach 今天开发同学向我们提了一个紧急的需求,从集合mt_resources_access_log中,根据字段refererDomain分组,取分 ...
- MySQL中分组取第一条, 以及删除多余的重复记录
检查重复记录 -- 检查重复code1 select count(identity) num, identity from event_log where code='code1' order by ...
- sql分组取第一条数据
sq分组取第一条数据的一个方法: select * from ( select row_number() over(partition by ID order by ID) as rownum , * ...
- Oracle分组取第一条数据
看看曾经的私密日志.原来自己之前被非常多小而简单的问题困惑过. 看着那时候我们还是新手中的新手做的备忘笔记! 事实上就是用了Oracle的统计函数而已! 曾经的日记(看样子应该是曾经公司的源代码,呵呵 ...
- oracle 根据字段分组取第一条数据及rank函数说明
当前有这样一个需求,根据外键对子表数据进行分组,取每组中的一条数据就行了,如图: 如:COMMANDID = 26的有两条,只取一条数据. sql语句: select * from(select SY ...
- 取得数据表中前N条记录,某列重复的话只取第一条记录
项目需要筛选出不重复数据,以前没有做过,第一反应就是利用distinct处理,但是弄了好久也没搞出来,大家有知道的望告知下. 这次筛选没有使用distinct ,是利用group by ,利用id为唯 ...
- oracle分组取第一条
SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY x ORDER BY y DESC) rn,test1.* FROM test1) WHERE ...
- 利用over开窗函数取第一条记录
SQL> set linesize 200 SQL> select * from (select a.* ,row_number() over( order by empno) rn f ...
- sql分组获取第一条记录(sql+oracle)
sql版本 select * from (select t.CloseDate,t.ExpiryDate,t.DataTypeLookupID,ROW_NUMBER() over(partition ...
随机推荐
- HDU4757:Tree——题解
http://acm.hdu.edu.cn/showproblem.php?pid=4757 给一棵有点值的树,每次询问u~v的最短路当中的一个点的点权异或z最大值. 前置技能:HDU4825 前置技 ...
- swift的UIbutton
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, ...
- [LeetCode] 22. Generate Parentheses ☆☆
Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...
- wiki文档书写格式
文档基本规范 标题 标题:标明需求的简短语句.或模块名称,目录是由标题生成,一份目录结构清晰的需求文档与标题的划分是密不可分. 正文 正文:有规范格式和生效标志的正式文本,正文包括 文字.表格.图片. ...
- 【51NOD】1096 距离之和最小
[算法]数学 [题解] 其实就是求中位数,奇数个点就是最中间的点,偶数个点就是最中间两个点和它们之间的区域皆可(所以偶数不必取到两点正中央,取两点任意一点即可). 我们可以想象现在x轴上有n个点,我们 ...
- 15、简述MySQL的执行计划?
具体的Mysql的执行计划,请参考下面的链接: MySQL_执行计划详细说明
- bzoj 2440 容斥原理
首先根据样例或者自己打表大概可以知道,对于询问k,答案不会超过k<<1,那么我们就可以二分答案,求当前二分的值内有多少个数不是完全平方数的倍数,这样就可以了,对于每个二分到的值x,其中完全 ...
- Centos 7 安装jdk1.7
在linux中安装jdk是很平凡的事情了,刚学习linux给自己留下一笔记.刚安装centos其中可以会附带jdk,但是这并不影响,只要下载自己的jdk然后替换相对应的环境变量即可. 1.下载相对应的 ...
- 转载:WebView
前言 现在很多App里都内置了Web网页(Hyprid App),比如说很多电商平台,淘宝.京东.聚划算等等,如下图 那么这种该如何实现呢?其实这是Android里一个叫WebView的组件实现的.今 ...
- 关于RecylerView:1.在ScrollView的RecylerView滑动事件的处理。2.item之间的距离 小数取整
1.在ScrollView的RecylerView滑动事件的处理. 在布局文件中在RecylerView外包裹一层相对布局 2.RecylerView item之间的距离 (1)编写SpaceItem ...