hive分組去前幾條資料

2021-08-19 03:06:14 字數 1829 閱讀 3273

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

簡寫版的表結構:

表資料:

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

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

onold.uid = new.uid where

old.uid is

null

;

分組查詢前幾條資料

create table t id varchar 3 gid int,author varchar 29 title varchar 39 date datetime insert into tselect 001 1,鄒建 深入淺出sqlserver2005開發管理與應用例項 2008 05 1...

分組查詢前幾條資料

create table t id varchar 3 gid int,author varchar 29 title varchar 39 date datetime insert into tselect 001 1,鄒建 深入淺出sqlserver2005開發管理與應用例項 2008 05 1...

sql取分組的前幾條 指定條數

注 sqlserver下 create table test areaid int,score int insert into test select 0,10 union all select 0,20 union all select 0,30 union all select 0,40 uni...