Functions and Operators
基于Presto 0.215版本的中文注释 函数大全,参考官方文档:https://prestodb.github.io/docs/0.215/functions.html
6.1. 逻辑操作
6.2. 比较函数和运算符
6.3. 条件表达式
6.4. Lambda 表达式
6.5. 转换函数
6.6. 数学函数和运算符
6.7. 位运算函数
6.8. 小数函数和运算符
6.9. 字符串函数和运算符
6.10. Regular Expression Functions
6.11. 二进制函数和运算符
6.12. json函数和运算符
6.13. 时间日期函数和运算符
6.14. 聚合函数
6.15. 窗口函数
6.16. array数组函数
6.17. map函数
6.18. url函数
6.19. 地理相关函数
6.20. 基数估算算法函数
6.21. Quantile Digest Functions
6.22. Color Functions
6.23. Session Information
6.24. Teradata Functions
6.1 逻辑运算符
逻辑运算符
操作 |
描述 |
例子 |
AND |
两个值都为true,则为true |
a AND b |
OR |
两个值其中一个为true,则为true |
a OR b |
NOT |
值为false,结果则为true |
NOT a |
6.2 比较函数和运算符
比较操作
操作 |
描述 |
< |
小于 |
> |
大于 |
<= |
小于等于 |
>= |
大于等于 |
= |
等于 |
<> |
不等于 |
!= |
不等于 |
范围比较:between
between适用于值在一个特定的范围内, 使用方法:value BETWEEN min AND max,
Not between 使用于值不在某个特定范围内。
null值不能出现在between操作中,如下两种执行结果都是Null
SELECT NULL BETWEEN 2 AND 4; -- null
SELECT 2 BETWEEN NULL AND 6; -- null
presto中,value, min, and max 三个参数在between 和not between中必须是同一数据类型。’John’ between 2.3 and 35.2 这种就会报错
IS NULL 和IS NOT NULL
用于判断值是否为空,所有数据类型都可以用于此判断
IS DISTINCT FROM 和IS NOT DISTINCT FROM
特有用法。在presto的sql中,null代表未知值,任何表达式中一旦包含Null,最后结果也会是null,IS DISTINCT FROM和IS NOT DISTINCT FROM可以把null值当成某个已知值,从而使结果返回true或者false(即使表达式中有Null值)。一般不会用到,欲知详情,参考官方文档
GREATEST 和 LEAST
这两个函数不是SQL标准函数,他们是常用的扩展。参数中不能有Null值。
greatest(value1, value2, ..., valueN)
返回提供的最大值
least(value1, value2, ..., valueN) → [same as input]
返回提供的最小值
批量比较判断: ALL, ANY 和SOME
ALL, ANY 和SOME可以在以下情况使用
和子查询进行比较
例如:
SELECT 'hello' = ANY (VALUES 'hello', 'world'); -- true
SELECT 21 < ALL (VALUES 19, 20, 21); -- false
SELECT 42 >= SOME (SELECT 41 UNION ALL SELECT 42 UNION ALL SELECT 43);
-- true
6.3. 条件表达式
CASE
标准的SQL CASE 表达式有两种模式。 “简单模式”从左向右查找表达式的每个 value , 直到找出相等的 expression:
CASE expression
WHEN value THEN result
[ WHEN ... ]
[ ELSE result ]
END
返回匹配 value 的 result 。 如果没有匹配到任何值,则返回 ELSE 子句的 result ; 如果没有 ELSE 子句,则返回空。示例:
SELECT a,
CASE a
WHEN 1 THEN 'one'
WHEN 2 THEN 'two'
ELSE 'many' END
“查找模式”从左向右判断每个 condition 的布尔值, 直到判断为真,返回匹配 result :
CASE
WHEN condition THEN result
[ WHEN ... ]
[ ELSE result ] END
如果判断条件都不成立,则返回 ELSE 子句的 result ; 如果没有 ELSE 子句,则返回空。示例:
SELECT a, b,
CASE
WHEN a = 1 THEN 'aaa'
WHEN b = 2 THEN 'bbb'
ELSE 'ccc' END
IF
IF 函数是语言结构,它与下面的 CASE 表达式功能相同:
CASE
WHEN condition THEN true_value
[ ELSE false_value ] END
if(condition, true_value)
如果 condition 为真,返回 true_value ; 否则返回空, true_value 不进行计算。
if(condition, true_value, false_value)
如果 condition 为真,返回 true_value ; 否则计算并返回 false_value 。
COALESCE
coalesce(value[, ...])
返回参数列表中的第一个非空 value 。 与 CASE 表达式相似,仅在必要时计算参数。
可类比mysql的nvl功能,经常用于转空值为0或者’’(空字符)。
NULLIF
nullif(value1, value2)
如果 value1 与 value2 相等,返回空;否则返回 value1 。
TRY
评估一个表达式,如果出错,则返回Null。类似于编程语言中的try catch
try函数一般结合COALESCE使用,COALESCE可以将异常的空值转为0或者’’
以下情况会被try捕获:
分母为0
错误的cast操作或者函数入参
数字超过了定义长度
个人不推荐使用,应该明确以上异常,做数据预处理
6.4. Lambda 表达式
不常用,具体参考官方文档
6.5. 转换函数
cast转换函数
Presto会将数字和字符值隐式转换成正确的类型。 Presto不会把字符和数字类型相互转换。 例如,一个查询期望得到一个varchar类型的值, Presto不会自动将bigint类型的值转换为varchar类型。
如果有必要,可以将值显式转换为指定类型。
cast(value AS type) → type
显式转换一个值的类型。 可以将varchar类型的值转为数字类型,反过来转换也可以。try_cast(value AS type) → type
与 cast() 相似,区别是转换失败返回null。
数据格式
parse_presto_data_size(string) -> decimal(38)
将一个字符串的数据格式转换为数字,基本数据类型。举例:
SELECT parse_presto_data_size('1B'); -- 1
SELECT parse_presto_data_size('1kB'); -- 1024
SELECT parse_presto_data_size('1MB'); -- 1048576
SELECT parse_presto_data_size('2.3MB'); -- 2411724
数据类型
typeof(expr) → varchar
返回表达式的数据类型。
6.6 数学函数和运算符
数学运算符
Operator |
Description |
+ |
加 |
- |
减 |
* |
乘 |
/ |
除 |
% |
取余 |
数学函数
abs(x) → [same as input]
返回x的绝对值
ceil(x) → [same as input]
同ceiling()
ceiling(x) → [same as input]
返回x的向上取整的数值
rand() → double
保留几位小数
select round(3.1415,2) --3.14
cbrt(x) → double
degrees(x) → double
e() → double
exp(x) → double
floor(x) → [same as input]
from_base(string, radix) → bigint
ln(x) → double
log2(x) → double
log10(x) → double
log(x, b) → double
mod(n, m) → [same as input]
pi() → double
pow(x, p) → double
radians(x) → double
random() → double
随机数
round(x) → [same as input]
round(x, d) → [same as input]
sqrt(x) → double
to_base(x, radix) → varchar
以上为不常用的数学函数,具体可参考官方文档
统计学函数
wilson_interval_lower(successes, trials, z) → double
wilson_interval_upper(successes, trials, z) → double
三角函数
所有三角函数的参数都是以弧度表示。参考单位转换函数degrees() 和 radians()。不做详细介绍。
acos(x) → double
asin(x) → double
atan(x) → double
atan2(y, x) → double
cos(x) → double
cosh(x) → double
sin(x) → double
tan(x) → double
tanh(x) → double
浮点函数
infinity() → double
is_finite(x) → boolean
is_infinite(x) → boolean
is_nan(x) → boolean
nan() → double
6.7. Bitwise函数
bit_count(x, bits) → bigint
Count the number of bits set in x (treated as bits-bit signed integer) in 2’s complement representation:
SELECT bit_count(9, 64); -- 2
SELECT bit_count(9, 8); -- 2
SELECT bit_count(-7, 64); -- 62
SELECT bit_count(-7, 8); -- 6
bitwise_and(x, y) → bigint
Returns the bitwise AND of x and y in 2’s complement representation.
bitwise_not(x) → bigint
Returns the bitwise NOT of x in 2’s complement representation.
bitwise_or(x, y) → bigint
Returns the bitwise OR of x and y in 2’s complement representation.
bitwise_xor(x, y) → bigint
Returns the bitwise XOR of x and y in 2’s complement representation.
See also bitwise_and_agg() and bitwise_or_agg().
6.8. Decimal 函数和运算符
略
6.9. 字符串函数和运算符
字符串运算符
|| 表示字符连接
SELECT 'he'||'llo' --hello
字符串函数
chr(n) → varchar
返回在下标为n的位置的char字符的字符串格式表示
select chr(100) --d
concat(string1, string2) → varchar
字符串连接
length(string) → bigint
返回字符串的长度
lower(string) → varchar
转换为小写
ltrim(string) → varchar
去掉字符串开头的空格
replace(string, ‘a’) → varchar
去掉字符串中的a字符
replace(string, ‘a’, ‘b’) → varchar
把字符串中所有的a字符 替换 为 b
reverse(string) → varchar
字符串倒序
rtrim(string) → varchar
去掉字符串尾部的空格
split(string, delimiter) → array<varchar>
将字符串按限定符(delimiter)分隔为一个array
split(string, delimiter, limit) → array<varchar>
将字符串按限定符(delimiter)分隔为一个array,限定数量。最后一个元素包含了最后一个字符串后面所有的字符。Limit 必须是个数字
split_part(string, delimiter, index) → varchar
将字符串按限定符(delimiter)分隔为一个array.取出制定索引的元素。index从1开始,如果Index超过了数组长度,则返回null。
strpos(string, substring) → bigint
返回字符串中第一次出现substring的位置。从1开始,如果未找到,返回0。举例:
select strpos('hello world!','l') --3
select strpos('hello world!','da') --0
substr(string, start) → varchar
从start位置 开始 截取字符串
substr(string, start, length) → varchar
从start位置 开始 截取字符串,截取的长度为length。
一般用于截取时间戳格式
Select substr(‘2019-03-10 10:00:00’,1,10) --截取到日 2019-03-10
Select substr(‘2019-03-10 10:00:00’,1,7) --截取到月 2019-03
trim(string) → varchar
去掉字符串首尾的空格
upper(string) → varchar
将字符串转为大写
6.10. 正则表达式函数
所有的正则表达式函数都使用Java样式的语法。具体介绍参考官方文档
regexp_extract_all(string, pattern) -> array(varchar)
regexp_extract_all(string, pattern, group) -> array(varchar)
regexp_extract(string, pattern) → varchar
regexp_extract(string, pattern, group) → varchar
regexp_like(string, pattern) → boolean
regexp_replace(string, pattern) → varchar
regexp_replace(string, pattern, replacement) → varchar
regexp_replace(string, pattern, function) → varchar
regexp_split(string, pattern) -> array(varchar)
6.11. 二进制函数和运算符
length(binary) → bigint
返回 binary 的字节长度。
to_base64(binary) → varchar
将 binary 编码为base64字符串表示。
from_base64(string) → varbinary
将base64编码的 string 解码为二进制数据。
to_base64url(binary) → varchar
使用URL安全字符,将 binary 编码为base64字符串表示。
from_base64url(string) → varbinary
使用URL安全字符,将base64编码的 string 解码为二进制数据。
to_hex(binary) → varchar
将 binary 编码为16进制字符串表示。
from_hex(string) → varbinary
将16进制编码的 string 解码为二进制数据。
其他具体参考官方文档
6.12. json函数和运算符
Cast to JSON
SELECT CAST(9223372036854775807 AS JSON); -- JSON '9223372036854775807'
Cast from JSON
SELECT CAST(JSON '[1,23,456]' AS ARRAY(INTEGER)); -- [1, 23, 456]
以上两种都很少使用
JSON 函数
is_json_scalar(json) → boolean
判断json是否为纯量
json_array_contains(json, value) → boolean
判断json中是否包含某个值 value
json_array_get(json_array, index) → json
返回指定索引位置的json元素,索引从0开始。
SELECT json_array_get('["a", [3, 9], "c"]', 0); -- JSON 'a' (invalid JSON)
SELECT json_array_get('["a", [3, 9], "c"]', 1); -- JSON '[3,9]'
索引页支持负数,表示从最后开始,-1表示最后一个元素。例:
SELECT json_array_get('["c", [3, 9], "a"]', -1); -- JSON 'a' (invalid JSON)
SELECT json_array_get('["c", [3, 9], "a"]', -2); -- JSON '[3,9]'
索引超过实际长度会返回null
json_array_length(json) → bigint
返回json的长度
json_extract(json, json_path) → json
按照json_path格式 抓取json中的信息
json_extract_scalar(json, json_path) → varchar
和json_extract功能相同,返回值是varchar
json_format(json) → varchar
把json值转为序列化的json文本
json_parse(string) → json
和json_format(json)功能相反,将json格式的字符串转换为json。
Json_parse和json_extract通常结合使用,用于解析数据表中的json字符串,例子:
Select json_extract(json_parse(sku_info),'$.purchase_price_rmb')
From chuangwai.sku_purchase_units limit 100
解析spu表中sku_info字段 里的采购价
json_size(json, json_path) → bigint
和json_extract类似,但是返回的是json里的对象个数。
SELECT json_size('{ "x": {"a": 1, "b": 2} }', '$.x'); => 2
SELECT json_size('{ "x": [1, 2, 3] }', '$.x'); => 2
SELECT json_size('{ "x": {"a": 1, "b": 2} }', '$.x.a'); => 0
6.13. 日期时间函数和运算符
日期时间运算符
运算符 |
示例 |
结果 |
+ |
date '2012-08-08' + interval '2' day |
2012-08-10 |
+ |
time '01:00' + interval '3' hour |
04:00:00.000 |
+ |
timestamp '2012-08-08 01:00' + interval '29' hour |
2012-08-09 06:00:00.000 |
+ |
timestamp '2012-10-31 01:00' + interval '1' month |
2012-11-30 01:00:00.000 |
+ |
interval '2' day + interval '3' hour |
2 03:00:00.000 |
+ |
interval '3' year + interval '5' month |
3-5 |
- |
date '2012-08-08' - interval '2' day |
2012-08-06 |
- |
time '01:00' - interval '3' hour |
22:00:00.000 |
- |
timestamp '2012-08-08 01:00' - interval '29' hour |
2012-08-06 20:00:00.000 |
- |
timestamp '2012-10-31 01:00' - interval '1' month |
2012-09-30 01:00:00.000 |
- |
interval '2' day - interval '3' hour |
1 21:00:00.000 |
- |
interval '3' year - interval '5' month |
2-7 |
时区转换
运算符:AT TIME ZONE,用于设置一个时间戳的时区:
SELECT timestamp '2012-10-31 01:00 UTC';
2012-10-31 01:00:00.000 UTC
SELECT timestamp '2012-10-31 01:00 UTC' AT TIME ZONE 'Asia/Shanghai';
2012-10-30 09:00:00.000 Asia/Shanghai
日期时间函数
current_date -> date
返回当前日期(utc时区)
current_time -> time with time zone
返回当前时间(utc时区)
current_timestamp -> timestamp with time zone
返回当前时间戳(utc时区)
current_timezone() → varchar
返回当前时区
date(x) → date
将日期字面量转换成日期类型的变量
from_iso8601_timestamp(string) → timestamp with time zone
将 ISO 8601 格式的时戳字面量转换成带时区的时戳变量
from_iso8601_date(string) → date
将 ISO 8601 格式的日期字面量转换成日期类型的变量
from_unixtime(unixtime) → timestamp
将UNIX时戳转换为时间戳
Select FROM_UNIXTIME(875996580) --1997-10-04 20:23:00.000
from_unixtime(unixtime, string) → timestamp with time zone
将UNIX时戳转换成时戳变量.可以带时区选项
from_unixtime(unixtime, hours, minutes) → timestamp with time zone
将 UNIX 时戳转换成带时区的时戳变量。hours和minutes表示时区偏移量。
localtime -> time
获取当前时间
localtimestamp -> timestamp
获取当前时间戳
now() → timestamp with time zone
获取当前时间,current_time的别名
to_unixtime(timestamp) → double
将时间戳转换成 UNIX 时间
to_iso8601(x) → varchar
将x转换成ISO8601格式的字符串。这里x可以是DATE、TIMESTAMP [with time zone]这几个类型
to_milliseconds(interval) → bigint
获取当前距当天零时已经过去的毫秒数
to_unixtime(timestamp) → double
将时间戳转换成 UNIX 时间
注意
使用下列 SQL 标准函数时,不用使用圆括号:
current_data
current_time
current_timestamp
localtime
Localtimestamp
截取函数
类似于保留几位小数的操作,函数 date_trunc 支持如下单位:
单位 |
截取后的值 |
second |
2001-08-22 03:04:05.000 |
minute |
2001-08-22 03:04:00.000 |
hour |
2001-08-22 03:00:00.000 |
day |
2001-08-22 00:00:00.000 |
week |
2001-08-20 00:00:00.000 |
month |
2001-08-01 00:00:00.000 |
quarter |
2001-07-01 00:00:00.000 |
year |
2001-01-01 00:00:00.000 |
上面的例子使用时间戳: 2001-08-22 03:04:05.321 作为输入。
date_trunc(unit, x) → [same as input]
返回x截取到单位unit之后的值
间隔函数
本章中的函数支持如下所列的间隔单位:
Unit |
Description |
second |
Seconds |
minute |
Minutes |
hour |
Hours |
day |
Days |
week |
Weeks |
month |
Months |
quarter |
Quarters of a year |
year |
Years |
date_add(unit, value, timestamp) → [same as input]
在timestamp的基础上加上value个unit。如果想要执行相减的操作,可以通过将value赋值为负数来完成。
date_diff(unit, timestamp1, timestamp2) → bigint
返回 timestamp2 - timestamp1 之后的值,该值的表示单位是unit。
unit的值是字符串。例如:’day’ ‘week’ ‘year’
持续时间函数
持续时间可以使用以下单位:
单位 |
描述 |
ns |
纳秒 |
us |
微秒 |
ms |
毫秒 |
s |
秒 |
m |
分钟 |
h |
小时 |
d |
天 |
parse_duration(string) → interval
例子如下:
SELECT parse_duration('42.8ms'); -- 0 00:00:00.043
SELECT parse_duration('3.81 d'); -- 3 19:26:24.000
SELECT parse_duration('5m'); -- 0 00:05:00.000
MySQL 日期函数
在这一章节使用与MySQL date_parse和str_to_date方法兼容的格式化字符串。
date_format(timestamp, format) → varchar
使用format格式化timestamp。
date_parse(string, format) → timestamp
按format格式解析日期字面量。
下面的表格是基于MySQL手册列出的,描述了各种格式化描述符:
格式化描述符 |
描述 |
%a |
对应的星期几 (Sun .. Sat) |
%b |
对应的月份 (Jan .. Dec) |
%c |
对应的月份 (1 .. 12) [4] |
%D |
对应该月的第几天 (0th, 1st, 2nd, 3rd, ...) |
%d |
对应该月的第几天, 数字(01 .. 31) (两位,前面会补0) |
%e |
对应该月的第几天, 数字 (1 .. 31) |
%f |
小数以下的秒(6 digits for printing: 000000 .. 999000; 1 - 9 digits for parsing: 0 .. 999999999) [1] |
%H |
小时(00 .. 23) |
%h |
小时(01 .. 12) |
%I |
小时(01 .. 12) |
%i |
分钟, 数字(00 .. 59) |
%j |
一年的第几天 (001 .. 366) |
%k |
小时(0 .. 23) |
%l |
小时(1 .. 12) |
%M |
月份名称 (January .. December) |
%m |
月份, 数字(01 .. 12) [4] |
%p |
AM or PM |
%r |
时间, 12小时制(hh:mm:ss followed by AM or PM) |
%S |
秒(00 .. 59) |
%s |
秒(00 .. 59) |
%T |
时间, 24小时制 (hh:mm:ss) |
%U |
周(00 .. 53), 星期天是一周的第一天 |
%u |
周(00 .. 53), 星期一是一周的第一天 |
%V |
周(01 .. 53), 星期天是一周的第一天; 与%X配合使用 |
%v |
星期 (01 .. 53), 第一条为星期一,与%X配合使用 |
%W |
周几 (Sunday .. Saturday) |
%w |
本周的第几天 (0 .. 6), 星期天是一周的第一天 |
%X |
年份,数字,4位,第一天为星期日 |
%x |
年份,数字,4位,第一天为星期一 |
%Y |
年份,数字,4位 |
%y |
年份,数字,2位, 表示年份范围为[1970, 2069] |
%% |
表示字符'%' |
Warning
这些格式化描述符现在还不支持:%D %U %u %V %X
Java 日期函数
在这一章节中使用的格式化字符串都是与Java的 SimpleDateFormat样式兼容的。
date_format(timestamp, format) → varchar
使用format格式化timestamp。
date_parse(string, format) → timestamp
解析时间戳字符串
抽取函数
extract(field FROM x) → bigint
从x中返回域field
可以使用抽取函数来抽取如下域:
域 |
描述 |
YEAR |
|
QUARTER |
|
MONTH |
|
WEEK |
|
DAY |
|
DAY_OF_MONTH |
|
DAY_OF_WEEK |
|
DOW |
|
DAY_OF_YEAR |
|
DOY |
|
YEAR_OF_WEEK |
|
YOW |
|
HOUR |
|
MINUTE |
|
SECOND |
|
TIMEZONE_HOUR |
|
TIMEZONE_MINUTE |
抽取函数支持的数据类型取决于需要抽取的域。大多数域都支持日期和时间类型。
Note
SQL标准的函数一般都会使用特定的语法来指定参数。
便利的抽取函数
day(x) → bigint
返回x对应的月份天数
day_of_month(x) → bigint
和day()一样
day_of_week(x) → bigint
返回国际标准的周几
day_of_year(x) → bigint
返回在一年的天数,值范围:1~366
dow(x) → bigint
day_of_week()的另一种写法
doy(x) → bigint
day_of_year()的另一种写法
hour(x) → bigint
返回x所在的小时. The value ranges from 0 to 23.
minute(x) → bigint
返回x所在的分钟
month(x) → bigint
返回x所在的月份
quarter(x) → bigint
返回x所在的季度。 The value ranges from 1 to 4.
second(x) → bigint
返回x所在的秒
timezone_hour(timestamp) → bigint
timezone_minute(timestamp) → bigint
week(x) → bigint
返回x所在的周数. The value ranges from 1 to 53.
week_of_year(x) → bigint
week()的另一种写法.
year(x) → bigint
返回x所在的年份.
year_of_week(x) → bigint
yow(x) → bigint
6.14. 聚合函数
聚合函数作用于一个数据集,计算出一个单独的结果。
除了 count() 、 count_if() 、 max_by() 和 approx_distinct() , 所有聚合函数都忽略空值,如果没有输入或全部输入都为空时,返回空。 例如, sum() 返回空,而不是0。 avg() 会将数据中的空值进行计数。 coalesce 函数可以将空转换为0。
有些聚合函数比如array_agg()的结果依据输入值的顺序。这种情况可以通过ORDER BY Clause 来确定一个输出。
array_agg(x ORDER BY y DESC)
array_agg(x ORDER BY x, y, z)
一般聚合函数
arbitrary(x) → [same as input]
返回 x 的任意非空值(如果存在的话)。
array_agg(x) → array<[same as input]>
从输入的元素中创建数组
avg(x) → double
返回所有输入值的平均数(算术平均数)。
avg(time interval type) → time interval type
计算输入时间序列的平均时间间隔
bool_and(boolean) → boolean
如果所有输入的值都为 TRUE,则返回 TRUE,否则返回FALSE
bool_or(boolean) → boolean
如果输入的序列中有一个为 True ,则返回 True ,否则返回 False
checksum(x) → varbinary
返回 x 的校验和(顺序不敏感)
count(*) → bigint
返回行数
count(x) → bigint
返回非 null 元素的个数
count_if(x) → bigint
返回 x 中元素为True 的个数,等同于count(CASE WHEN x THEN 1 END).
every(boolean) → boolean
同bool_and
geometric_mean(x) → double
返回 x 的几何平均值
max_by(x, y) → [same as x]
返回与 y 的最大值相关的 x 值
max_by(x, y, n) → array<[same as x]>
返回与 y 的前 n 个最大值相关的 x 值的数组。
此方法很强,例如 统计销量前五的供应商 max_by(供应商,销量,5) ,可以替代一些使用row_number后再取前五的操作,会比row_number 性能更好 。
min_by(x, y) → [same as x]
返回与 y 的最小值相关的 x 值
min_by(x, y, n) → array<[same as x]>
返回与 y 的前 n 个最小值相关的 x 值的数组
max(x) → [same as input]
返回最大值
max(x, n) → array<[same as x]>
返回前 n 个最大值列表
min(x) → [same as input]
返回最小值
min(x, n) → array<[same as x]>
返回前 n 个最小值列表
sum(x) → [same as input]
求和
位运算聚合函数
bitwise_and_agg(x) → bigint
返回 x 中所有值的与操作结果,x 为数组
bitwise_or_agg(x) → bigint
返回 x 中所有值的或操作结果,x 位数组
Map聚合函数
histogram(x) -> map(K, bigint)
统计直方图
map_agg(key, value) -> map(K, V)
创建一个MAP类型的变量
map_union(x(K, V)) -> map(K, V)
返回输入map列表的 Union 结果,如果有多个 map 对象包含相同的key,最终的结果中,对于 key 的 value 随机的从输入的 map 中选取。
multimap_agg(key, value) -> map(K, array(V))
创建一个多重映射的MAP变量
近似聚合函数
不做详解,具体参见官方文档
统计聚合函数
不做详解,具体参见官方文档
6.15. 窗口函数
窗口函数主要用于在查询结果的所有行之间进行计算。窗口函数运行在HAVING语句之后,但是运行在ORDER BY语句之前。如果想要调用窗口函数,需要使用OVER语句来指定窗口。一个窗口有3个组成部分。
例如:下面的查询将orders表中的信息按照每个出纳员营业额的大小进行排序:
SELECT orderkey, clerk, totalprice,
rank() OVER (PARTITION BY clerk
ORDER BY totalprice DESC) AS rnk
FROM orders
ORDER BY clerk, rnk
聚合函数
所有的聚合函数,都可以通过加上over关键字 变成窗口函数来使用。聚合函数 会计算 当前行所对应的所有窗口行。
举例,下面查询表示 对于每个clerk 按天顺序 对订单价格 累加。
SELECT clerk, orderdate, orderkey, totalprice,
sum(totalprice) OVER (PARTITION BY clerk
ORDER BY orderdate) AS rolling_sum
FROM orders
ORDER BY clerk, orderdate, orderkey
排序函数
cume_dist() → bigint
小于等于当前值的行数/分组内总行数
dense_rank() → bigint
具体见官方文档
ntile(n) → bigint
具体见官方文档
percent_rank() → double
分组内当前行的RANK值-1/分组内总行数-1
rank() → bigint
排序,可以存在并列情况
row_number() → bigint
排序,从1开始,无重复序号
值函数
first_value(x) → [same as input]
last_value(x) → [same as input]
nth_value(x, offset) → [same as input]
lead(x[, offset[, default_value]]) → [same as input]
lag(x[, offset[, default_value]]) → [same as input]
具体见官方文档
6.16. array数组函数
6.18. url函数
6.19. 地理相关函数
6.20. 基数估算算法函数
6.21. Quantile Digest Functions
以上不常用函数库,具体见官方文档