函数声明如下:ARRAY sort_array(ARRAY)
函数用途:对给定中的数组排序
参数说明:ARRAY,ARRAY类型数据,数组中的数据可为任意类型。
返回值:ARRAY类型
示例:
--建表
CREATE TABLE sort_array
(
c1 ARRAY<STRING>
,c2 ARRAY<INT>
)
;
--装载数据
INSERT OVERWRITE TABLE sort_array
SELECT array('d','c','b','a') AS c1
,array(4,3,2,1) AS c2
;
--查询
SELECT sort_array(c1)
,sort_array(c2)
FROM sort_array
;
--结果
["a","b","c","d"] [1,2,3,4]
基本语法:
analytic_function_name([argument_list])
OVER ([PARTITION BY partition_expression,…]
[ORDER BY sort_expression, … [ASC|DESC]])
聚合函数可为sum、avg、count、max、min,如下:
select *,
sum(成绩) over (order by 学号) as current_sum,
avg(成绩) over (order by 学号) as current_avg,
count(成绩) over (order by 学号) as current_count,
max(成绩) over (order by 学号) as current_max,
min(成绩) over (order by 学号) as current_min
from 班级表
结果:
以sum为例,如上图,聚合函数sum在窗口函数中,是对自身记录、及位于自身记录以上的数据进行求和的结果。比如0004号,在使用sum窗口函数后的结果,是对0001,0002,0003,0004号的成绩求和,若是0005号,则结果是0001号~0005号成绩的求和,以此类推。
不仅是sum求和,avg平均、count计数、max最大值、min最小值,也是同理,都是针对自身记录、以及自身记录之上的所有数据进行计算。
比如0005号后面的聚合窗口函数结果是:学号0001~0005五人成绩的总和、平均、计数及最大最小值。如果想要知道所有人成绩的总和、平均等聚合结果,看最后一行即可。
这样窗口函数有什么用?
聚合函数作为窗口函数,可以在每一行的数据里直观的看到,截止到本行数据,统计数据是多少(最大值、最小值等)。同时可以看出每一行数据,对整体统计数据的影响。
Attention:
sum( col ) over (partition by 分区 order by 排序 desc rows BETWEEN unbounded preceding AND current row
unbounded:无界限
preceding:从分区第一行头开始,则为 unbounded。 N为:相对当前行向前的偏移量
following :与preceding相反,到该分区结束,则为 unbounded。N为:相对当前行向后的偏移量
current row:顾名思义,当前行,偏移量为0
rank:对组中的数据进行排名,如果名次相同,则排名也相同,但是下一个名次的排名序号会出现不连续。比如查找具体条件的topN行。rank() 排序为 (1,2,2,4),简称并列跳跃。
dense_rank:dense_rank函数的功能与rank函数类似,dense_rank函数在生成序号时是连续的,而rank函数生成的序号有可能不连续。当出现名次相同时,则排名序号也相同。而下一个排名的序号与上一个排名序号是连续的。dense_rank()排序为(1,2,2,3),简称并列不跳跃。
row_number:row_number函数在生成序号时是连续的,当出现名次相同,排名序号也是连续的。row_number()排序为(1,2,3,4),简称不并列。
select datediff(order_date, first_value ( order_date ) over ( partition by cust_code order by order_date )) next_order_gap from orders
string regexp_extract(string
select regexp_extract('foothebar', '(foo)(.*?)(bar)', 0); --返回foothebar
select regexp_extract('foothebar', '(foo)(.*?)(bar)', 1); --返回foo
select regexp_extract('foothebar', '(foo)(.*?)(bar)', 2); --返回the
select regexp_extract('foothebar', '(foo)(.*?)(bar)', 3); --返回bar
select keyvalue('0:1\;1:2', 1); --返回2
select keyvalue('spm=123.qwe,cpn=101,act=890',',','=','spm') ----返回123.qwe