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
隨機數
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
year()
QUARTER
quarter()
MONTH
month()
WEEK
week()
DAY
day()
DAY_OF_MONTH
day()
DAY_OF_WEEK
day_of_week()
DOW
day_of_week()
DAY_OF_YEAR
day_of_year()
DOY
day_of_year()
YEAR_OF_WEEK
year_of_week()
YOW
year_of_week()
HOUR
hour()
MINUTE
minute()
SECOND
second()
TIMEZONE_HOUR
timezone_hour()
TIMEZONE_MINUTE
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.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
以上不常用函數庫,具體見官方文檔 https://prestodb.github.io/docs/0.215/functions.html