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 ...
 
随机推荐
- ACE线程管理机制-并发控制(4)
			
转载于:http://www.cnblogs.com/TianFang/archive/2006/12/04/581857.html ACE Synchronization类 这一类并发控制对象一般也 ...
 - 8VC Venture Cup 2016 - Final Round (Div. 2 Edition)  A
			
A. Orchestra time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
 - ACM1325Is it A tree?
			
通过这道简单而又坑人的题目,练习并查集和set 容器的使用: Is It A Tree? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
 - hive executeTask被interrupt处理
			
异常信息如下: java.io.IOException: Failed on local exception: java.nio.channels.ClosedByInterruptException ...
 - LAMP环境介绍
			
LAMP简介: Lamp是一组常用于来搭建动态网站或者服务器的开源软件平台,Linux apache mysql perl或php. Linux :提供操作系统 Apache:Web服务器 Mysql ...
 - UVA 10886 Standard Deviation
			
https://vjudge.net/problem/UVA-10886 计算标准差 碰到这种题将式子展开 #include<cmath> #include<cstdio> / ...
 - 替换Jar包中的一个文件 Replace a file in a JAR
			
例如: jar uf myJarFile.jar com\vsoft\servlet\myServlet.class This will replace the class myServlet.cla ...
 - struts2之OGNL用法
			
浅析OGNL OGNL是Object-GraphNavigation Language的缩写,是一种功能强大的表达式语言 通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对 ...
 - MySQL 5.7 跟踪优化器
			
Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 5Server version ...
 - 【Foreign】Uria [欧拉函数]
			
Uria Time Limit: 20 Sec Memory Limit: 512 MB Description 从前有个正整数 n. 对于一个正整数对 (a,b),如果满足 a + b ≤ n 且 ...