Hive分組取第一條記錄

2022-03-25 15:09:09 字數 1762 閱讀 7605

交易系統,財務要求維護每個使用者首個交易完成的訂單資料(首單表,可取每個使用者交易完成時間最老的訂單資料)。舉例:

簡寫版的表結構:

表資料:

則 財務希望彙總記錄如下:

uidorder_id

service_completion_time244

2017-02-03 12:23:01.0333

2017-11-30 12:23:01.0

語法: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;

分組查詢各組第一條記錄

我們在查詢資料的時候經常會遇到表中包含類似 型別 分組 等屬性字段。然後需要查詢出該分組下的第一條記錄。實現的sql如下 select name,link,type from select row number over partition by type order by name as row,...

group by分組取組內第一條

舉個例子 student表 select from student id name age gender 1 張三丰 16 12 滅絕師太 17 03 掃地僧 18 14 楊逍 19 1按照gender進行分組,獲取每個組內年齡最大的,很明顯gender為1的age應該是19,但是事實卻不是 sel...

Group By 分組並取第一條資料

mysql 我使用排序進行篩選,保證分組 排序之後我的第一條資料就是我要的資料 select a.code a.type as 班型 max a.num from select from cent ylb numclass group by code,type order by code,num d...