Hive之視窗函式

2021-09-24 18:05:09 字數 3655 閱讀 9090

對一定視窗期內的資料進行聚合。

示例:

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 (partition by cookieid order by create_time rows between 2 preceding and 1 following) as pv2

from lxy as a;

基本的語法是rows between 乙個時間點 and 乙個時間點。

row_number的用途的非常廣泛,排序最好用他,一般可以用來實現web程式的分頁,他會為查詢出來的每一行記錄生成乙個序號,依次排序且不會重複,注意使用row_number函式時必須要用over子句選擇對某一列進行排序才能生成序號。row_number用法例項:

select row_number() over(order by [subtime] desc) as row_num,* from [order]
rank函式用於返回結果集的分區內每行的排名, 行的排名是相關行之前的排名數加一。簡單來說rank函式就是對查詢出來的記錄進行排名,與row_number函式不同的是,rank函式考慮到了over子句中排序字段值相同的情況,如果使用rank函式來生成序號,over子句中排序字段值相同的序號是一樣的,後面字段值不相同的序號將跳過相同的排名號排下乙個,

select rank() over(order by [userid]) as rank,* from [order]

dense_rank函式的功能與rank函式類似,dense_rank函式在生成序號時是連續的,而rank函式生成的序號有可能不連續。dense_rank函式出現相同排名時,將不跳過相同排名號,rank值緊接上一次的rank值。在各個分組內,rank()是跳躍排序,有兩個第一名時接下來就是第四名,dense_rank()是連續排序,有兩個第一名時仍然跟著第二名。將上面的sql語句改由dense_rank函式來實現。

示例:select dense_rank() over(order by [userid]) as den_rank,* from [order]

ntile函式可以對序號進行分組處理,將有序分割槽中的行分發到指定數目的組中。各個組有編號,編號從一開始。 對於每乙個行,ntile 將返回此行所屬的組的編號。這就相當於將查詢出來的記錄集放到指定長度的陣列中,每乙個陣列元素存放一定數量的記錄。ntile函式為每條記錄生成的序號就是這條記錄所有的陣列元素的索引(從1開始)。也可以將每乙個分配記錄的陣列元素稱為「桶」。ntile函式有乙個引數,用來指定桶數。

示例:select ntile(4) over(order by [subtime] desc) as ntile,* from [order]
對於ntile函式,傳入的引數n是指要切分成多少份,返回對應的序號。

這幾個函式可以通過字面意思記得,lag是遲滯的意思,也就是對某一列進行往後錯行;lead是lag的反義詞,也就是對某一列進行提前幾行;first_value是對該列到目前為止的首個值,而last_value是到目前行為止的最後乙個值。

select *,

lag(pv, 2) over(partition by cookid2 order by log_date) as lag1,

lead(pv, 2, 0) over(partition by cookid2 order by log_date) as lead1,

first_value() over(partition by cookid2 order by log_date) as first_pv,

first_value() over(partition by cookid2 order by log_date) as last_pv,

last_value() over(partition by cookid2 order by log_date) as current_last_pv

from lxy3;

lag和lead裡面都是傳入三個引數,分別是排序的列名,滯後/往前的行數,以及預設填充值。因為我們在這裡的lead()裡面設定預設填充值為0,所以對於cookid後面兩行缺失值填充為0。 

select month,

day,

count(distinct cookieid) as count_id,

grouping__id

from lxw1234

group by month, day

grouping sets(month, day)

order by grouping__id;

grouping set(key1, key2)相當於是對不同字段進行group操作以後,再進行union all的操作。注意:

1.grouping_id是自動生成的,是進行了grouping_set()的操作之後。

2.下劃線有兩個需要先做group by操作再傳入grouping sets等價於先group再union all的做法

select month,null,count(distinct cookieid) as uv,1 as grouping__id from lxw1234 group by month 

union all

select null,day,count(distinct cookieid) as uv,2 as grouping__id from lxw1234 group by day

union all

select month,day,count(distinct cookieid) as uv,3 as grouping__id from lxw1234 group by month,day

cube就是比以上的grouping sets多了乙個兩列的整合,也就是笛卡爾乘積。

select month,

day,

count(distinct cookieid) as count_id,

grouping__id

from lxw1234

group by month, day

with cube

order by grouping__id;

hive sql之 視窗函式。

一 row number 函式 區別於其它排序函式,相當於多了乙個排序的列。資料準備 name money ming 12 yang 23 ming 35 ming 54 yang 43 1 按照其中money 進行排序並增加一行。select name,money,row number over ...

Scala之視窗函式排序

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

SQL知識之視窗函式

3 排序視窗函式 4 切分視窗函式 5 偏移視窗函式 6 first value last value 前言 視窗函式屬於sql的高階查詢功能,有些資料庫的低版本可能還不支援,如mysql5.7版本暫不支援,sql server是支援的。1 視窗函式的簡單介紹 2 累計計算視窗函式 2.1 普通累計...