hive sql之 視窗函式。

2021-10-03 19:39:14 字數 3720 閱讀 4516

一、row_number 函式

區別於其它排序函式,相當於多了乙個排序的列。

資料準備:

name money

ming 12

yang 23

ming 35

ming 54

yang 43

1、按照其中money 進行排序並增加一行。

select name,money,

row_number

() over (order by money) from lei_test;

結果:ming 12

1yang 23

2ming 35

3yang 43

4ming 54

5

2、row_number 按照name 進行分組,並按照 money 進行排序。

select name,money ,

row_number()

over

(partition by name order by money) from lei_test;

ming 12

1ming 35

2ming 54

3yang 23

1yang 43

2

3、實現分組取row_number 為確定值的資料(比如 row_number 等於一),即取出的資料是按照name進行分割槽,並按照money 進行排序後的資料。

select name,money,tb from (select name,money,

row_number

() over (partition by name order by money)

) tb from lei_test ) where tb =1;

結果:ming 12

1yang 23

1

二 、

1、rank() 函式和row_number 函式類似就是他會跳過成績相同的資料(如果 按照 name partiton並按照money進行order by 的化他相同的money 就會 row_number 會相同)

例如:

select name、money,

rank

() over (partition by name order by money) from lei_test;

結果為:

ming 12

1ming 12

1ming 35

3ming 54

4yang 23

1yang 43

2

2、dense_rank

dense_rank 函式和row_number函式類似。(區別:相同成績會並列,序列排序)

select name,money,

dense_rank()

over

(partition by name order by money) from lei_test;

結果ming 12

1ming 12

1ming 35

2ming 54

3yang 23

1yang 43

2

3、cume_dist() 小於等於當前值的行數/分組內總行數的比例。

select name,money cume_dist

() over (partition by name order by money) from lei_test;

結果為:

ming 12

0.5ming 12

0.5ming 35

0.75

ming 54

1.0yang 23

0.5yang 43

1.0

4、percent_rank() 分組當前行的rank值-1/分組的總行數-1

select name,money,

percent_rank()

over

(partition by name order by money) from lei_test;

結果為ming 12

0.0ming 12

0.0ming 35

0.6666666666666666

ming 54

1.0yang 23

0.0yang 43

1.0

5、ntile(n)函式,將資料分成n份

select name,money ,

ntile(2

) over (partition by name order by money) from lei_test;

結果為:

ming 12

1ming 12

1ming 35

2ming 54

2yang 23

1yang 43

2

三、視窗函式

1、leag(col,n,default)用於統計視窗內往上的n行值(上面可能只是給個 排序行數 這個返回的值)

select name,money,lead(money,

1)over (partition by name order by money) from lei_test;

返回結果:

ming 12

12ming 12

35ming 35

54ming 54 null

yang 23

43yang 43 null

與之對應的是顯示他之下的值。

select name,money,lag(money,1)

over(partition by name order by money)

from lei_test;

2、得到排序後的第乙個值

select name,money first_value

(money) over (partition by name ordre by money) from lei_test;

返回結果為:

ming 12

12ming 12

12ming 35

12ming 54

12yang 23

23yang 43

23

3、取出分組內排序後,截止到當前行,最後乙個值。

select name.money,

last_value

(money) over (partition by name order by money) from lei_test:

返回的結果為

ming 12

12ming 12

12ming 35

35ming 54

54yang 23

23yang 43

43

參考:

Hive之視窗函式

對一定視窗期內的資料進行聚合。示例 select sum a.pv over partition by cookieid order by create time rows between 3 preceding and current row as pv1,sum a.pv over partit...

hive視窗函式 Hive sql視窗函式原始碼分析

在了解了視窗函式實現原理 spark hive中視窗函式實現原理覆盤 和 sparksql比hivesql優化的點 視窗函式 之後,今天又擼了一遍hive sql 中視窗函式的原始碼實現,寫個筆記記錄一下。簡單來說,視窗查詢有兩個步驟 將記錄分割成多個分割槽 然後在各個分割槽上呼叫視窗函式。傳統的 ...

Scala之視窗函式排序

scala視窗函式這排序rank,重複排序和不重複排序 1 引入包 import org.apache.spark.sql.expressions.window import spark.implicits.2.建立測試的df,可以直接貼上測試。3.選擇按name分組,按score排序,且倒序。va...