阅读595 返回首页    go 人物


内建函数-下__SQL_大数据计算服务-阿里云

MaxCompute SQL中可以使用窗口函数进行灵活的分析处理工作,窗口函数只能出现在select子句中,窗口函数中不要嵌套使用窗口函数和聚合函数,窗口函数不可以和同级别的聚合函数一起使用。目前在一个MaxCompute SQL语句中,可以使用至多5个窗口函数。

窗口函数的语法

  1. window_func() over (partition by col1, [col2…]
  2. [order by col1 [asc|desc][, col2[asc|desc]…]] windowing_clause)
  • partition by部分用来指定开窗的列。分区列的值相同的行被视为在同一个窗口内。现阶段,同一窗口内最多包含1亿行数据,否则运行时报错。
  • order by用来指定数据在一个窗口内如何排序
  • windowing_clause部分可以用rows指定开窗方式,有两种方式: rows between x preceding|following and y preceding|following表示窗口范围是从前或后x行到前或后y行。 rows x preceding|following窗口范围是从前或后第x行到当前行。** x,y必须为大于等于0的整数常量,限定范围0 ~ 10000,值为0时表示当前行。必须指定order by才可以用rows方式指定窗口范围。

备注:

  • 并非所有的窗口函数都可以用rows指定开窗方式,支持这种用法的窗口函数有avg、count、max、min、stddev和sum。

COUNT

函数声明:

  1. bigint count([distinct] expr) over(partition by col1[, col2…]
  2. [order by col1 [asc|desc][, col2[asc|desc]…]] [windowing_clause])

用途:计算计数值。

参数说明:

  • expr:任意类型,当值为NULL时,该行不参与计算。当指定distinct关键字时表示取唯一值的计数值。
  • partition by col1[, col2…]:指定开窗口的列。
  • order by col1 [asc|desc], col2[asc|desc]:不指定order by时,返回当前窗口内expr的计数值,指定order by时返回结果以指定的顺序排序,并且值为当前窗口内从开始行到当前行的累计计数值。

返回值:Bigint类型。

备注:

  • 当指定distinct关键字时不能写order by。

示例:假设存在表test_src,表中存在bigint类型的列user_id,

  1. select user_id,
  2. count(user_id) over (partition by user_id) as count
  3. from test_src;
  4. +---------+------------+
  5. | user_id | count |
  6. +---------+------------+
  7. | 1 | 3 |
  8. | 1 | 3 |
  9. | 1 | 3 |
  10. | 2 | 1 |
  11. | 3 | 1 |
  12. +---------+------------+
  13. -- 不指定order by时,返回当前窗口内user_id的计数值
  14. select user_id,
  15. count(user_id) over (partition by user_id order by user_id) as count
  16. from test_src;
  17. +---------+------------+
  18. | user_id | count |
  19. +---------+------------+
  20. | 1 | 1 | -- 窗口起始
  21. | 1 | 2 | -- 到当前行共计两条记录,返回2
  22. | 1 | 3 |
  23. | 2 | 1 |
  24. | 3 | 1 |
  25. +---------+------------+
  26. -- 指定order by时,返回当前窗口内从开始行到当前行的累计计数值。

AVG

函数声明:

  1. avg([distinct] expr) over(partition by col1[, col2…]
  2. [order by col1 [asc|desc] [, col2[asc|desc]…]] [windowing_clause])

用途:计算平均值。

参数说明:

  • distinct:当指定distinct关键字时表示取唯一值的平均值。
  • expr:Double类型,若输入为string,bigint会隐式转换到double类型后参与运算,其它类型抛异常。当值为NULL时,该行不参与计算。Boolean类型不允许参与计算。
  • partition by col1[, col2]…:指定开窗口的列。
  • order by col1 [asc|desc], col2[asc|desc]:不指定order by时返回当前窗口内所有值的平均值,指定order by时返回结果以指定的方式排序,并且返回窗口内从开始行到当前行的累计平均值。

返回值:Double类型。

备注:

  • 指明distinct关键字时不能写order by。

MAX

函数声明:

  1. max([distinct] expr) over(partition by col1[, col2…]
  2. [order by col1 [asc|desc][, col2[asc|desc]…]] [windowing_clause])

用途:计算最大值。

参数说明:

  • expr:除Boolean以外的任意类型,当值为NULL时,该行不参与计算。当指定distinct关键字时表示取唯一值的最大值(指定该参数与否对结果没有影响)。
  • partition by col1[, col2…]:指定开窗口的列。
  • order by col1 [asc|desc], col2[asc|desc]:不指定order by时,返回当前窗口内的最大值。指定order by时,返回结果以指定的方式排序,并且值为当前窗口内从开始行到当前行的最大值。

返回值:同expr类型。

备注:

  • 当指定distinct关键字时不能写order by。

MIN

函数声明:

  1. min([distinct] expr) over(partition by col1[, col2…]
  2. [order by col1 [asc|desc][, col2[asc|desc]…]] [windowing_clause])

用途:计算最小值。

参数说明:

  • expr:除boolean以外的任意类型,当值为NULL时,该行不参与计算。当指定distinct关键字时表示取唯一值的最小值(指定该参数与否对结果没有影响)。
  • partition by col1[, col2..]:指定开窗口的列。
  • order by col1 [asc|desc], col2[asc|desc]:不指定order by时,返回当前窗口内的最小值。指定order by时,返回结果以指定的方式排序,并且值为当前窗口内从开始行到当前行的最小值。

返回值:同expr类型。

备注:

  • 当指定distinct关键字时不能写order by。

MEDIAN

函数声明:

  1. double median(double number1,number2...) over(partition by col1[, col2…])
  2. decimal median(decimal number1,number2...) over(partition by col1[,col2…])

用途:计算中位数。

参数说明:

  • number1,number1…:Double类型或decimal类型的1到255个数字。若输入为string类型或bigint类型会隐式转换到double类型后参与运算,其他类型抛异常。当输入值为null时忽略。如果传入的参数是一个Double类型的数,会默认转成一个double 的array。

  • partition by col1[, col2…]:指定开窗口的列。

返回值:Double类型。

STDDEV

函数声明:

  1. double stddev([distinct] expr) over(partition by col1[, col2…]
  2. [order by col1 [asc|desc][, col2[asc|desc]…]] [windowing_clause])
  3. decimal stddev([distinct] expr) over(partition by col1[,col2…] [order by col1 [asc|desc][, col2[asc|desc]…]] [windowing_clause])

用途:总体标准差。

参数说明:

  • expr:Double类型或decimal类型。若输入为string类型或bigint类型会隐式转换到double类型后参与运算,其他类型抛异常。当输入值为NULL时忽略该行。当指定distinct关键字时表示计算唯一值的总体标准差。

  • partition by col1[, col2..]:指定开窗口的列。

  • order by col1 [asc|desc], col2[asc|desc]:不指定order by时,返回当前窗口内的总体标准差。指定order by时,返回结果以指定的方式排序,并且值为当前窗口内从开始行到当前行的总体标准差。

返回值:输入为Decimal类型时返回Decimal类型,否则返回Double类型。

示例:

  1. select window, seq, stddev_pop('11') over (partition by window order by seq) from dual;

备注:

  • 当指定distinct关键字时不能写order by。
  • stddev还有一个别名函数stddev_pop,用法跟stddev一样。

STDDEV_SAMP

函数声明:

  1. double stddev_samp([distinct] expr) over(partition by col1[, col2…]
  2. [order by col1 [asc|desc][, col2[asc|desc]…]] [windowing_clause])

用途:样本标准差。

参数说明:

  • expr:Double类型。若输入为string类型或bigint类型会隐式转换到double类型后参与运算,其他类型抛异常。当输入值为NULL时忽略该行。当指定distinct关键字时表示计算唯一值的样本标准差。
  • partition by col1[, col2..]:指定开窗口的列。
  • order by col1 [asc|desc], col2[asc|desc]:不指定order by时,返回当前窗口内的样本标准差。指定order by时,返回结果以指定的方式排序,并且值为当前窗口内从开始行到当前行的样本标准差。

返回值:Double类型。

备注:

  • 当指定distinct关键字时不能写order by。

SUM

函数声明:

  1. sum([distinct] expr) over(partition by col1[, col2…]
  2. [order by col1 [asc|desc][, col2[asc|desc]…]] [windowing_clause])

用途:计算汇总值。

参数说明:

  • expr:Double类型或Bigint类型,当输入为string时隐式转换为double参与运算,其它类型报异常。当值为NULL时,该行不参与计算。指定distinct关键字时表示计算唯一值的汇总值。
  • partition by col1[, col2..]:指定开窗口的列。
  • order by col1 [asc|desc], col2[asc|desc]:不指定order by时,返回当前窗口内expr的汇总值。指定order by时,返回结果以指定的方式排序,并且返回当前窗口从首行至当前行的累计汇总值。返回值:输入参数是bigint返回bigint, 输入参数为double或string时,返回double类型。

返回值:输入参数是bigint返回bigint,输入参数为double或string时,返回double类型。

备注:

  • 当指定distinct时不能用order by。

DENSE_RANK

命令格式:

  1. bigint dense_rank() over(partition by col1[, col2…]
  2. order by col1 [asc|desc][, col2[asc|desc]…])

用途:计算连续排名。col2相同的行数据获得的排名相同。

参数说明:

  • partition by col1[, col2..]:指定开窗口的列。
  • order by col1 [asc|desc], col2[asc|desc]:指定排名依据的值。

返回值:Bigint类型。

RANK

命令格式:

  1. bigint rank() over(partition by col1[, col2…]
  2. order by col1 [asc|desc][, col2[asc|desc]…])

用途:计算排名。col2相同的行数据获得排名顺序下降。

参数说明:

  • partition by col2[, col2..]:指定开窗口的列。
  • order by col1 [asc|desc], col2[asc|desc]:指定排名依据的值。

返回值:Bigint类型。

LAG

函数声明:

  1. lag(expr,bigint offset, default) over(partition by col1[, col2…]
  2. [order by col1 [asc|desc][, col2[asc|desc]…]])

用途:按偏移量取当前行之前第几行的值,如当前行号为rn,则取行号为rn-offset的值。

参数说明:

  • expr:任意类型。
  • offset:Bigint类型常量,输入为string,double到bigint的隐式转换,offset > 0。
  • default:当offset指定的范围越界时的缺省值,常量,默认值为NULL。
  • partition by col1[, col2..]:指定开窗口的列。
  • order by col1 [asc|desc], col2[asc|desc]:指定返回结果的排序方式。

返回值:同expr类型。

LEAD

函数声明:

  1. lead(expr, bigint offset, default) over(partition by col1[, col2…]
  2. [order by col1 [asc|desc][, col2[asc|desc]…]])

用途:按偏移量取当前行之后第几行的值,如当前行号为rn则取行号为rn+offset的值。

参数说明:

  • expr:任意类型。

  • offset:可选,Bigint类型常量,输入为string,decimal,double到bigint的隐式转换,offset > 0。

  • default:可选,当offset指定的范围越界时的缺省值,常量。

  • partition by col1[, col2..]:指定开窗口的列。

  • order by col1 [asc|desc], col2[asc|desc]:指定返回结果的排序方式。

返回值:同expr类型。

示例:

  1. select c_double_a,c_string_b,c_int_a,lead(c_int_a,1) over(partition by c_double_a order by c_string_b) from dual;
  2. select c_string_a,c_time_b,c_double_a,lead(c_double_a,1) over(partition by c_string_a order by c_time_b) from dual;
  3. select c_string_in_fact_num,c_string_a,c_int_a,lead(c_int_a) over(partition by c_string_in_fact_num order by c_string_a) from dual;

PERCENT_RANK

函数声明:

  1. percent_rank() over(partition by col1[, col2…]
  2. order by col1 [asc|desc][, col2[asc|desc]…])

用途:计算一组数据中某行的相对排名。

参数说明:

  • partition by col1[, col2..]:指定开窗口的列。
  • order by col1 [asc|desc], col2[asc|desc]:指定排名依据的值。

返回值:Double类型,值域为[0, 1],相对排名的计算方式为为:(rank-1)/(number of rows -1)。

备注:

  • 目前限制单个窗口内的行数不超过10,000,000条。

ROW_NUMBER

函数声明:

  1. row_number() over(partition by col1[, col2…]
  2. order by col1 [asc|desc][, col2[asc|desc]…])

用途:计算行号,从1开始。

参数说明:

  • partition by col1[, col2..]:指定开窗口的列。
  • order by col1 [asc|desc], col2[asc|desc]:指定结果返回时的排序的值。

返回值:Bigint类型。

CLUSTER_SAMPLE

函数声明:

  1. boolean cluster_sample(bigint x[, bigint y])
  2. over(partition by col1[, col2..])

用途:分组抽样。

参数说明:

  • x:Bigint类型常量,x>=1。若指定参数y,x表示将一个窗口分为x份;否则,x表示在一个窗口中抽取x行记录(即有x行返回值为true)。x为NULL时,返回值为NULL。
  • y:Bigint类型常量,y>=1,y<=x。表示从一个窗口分的x份中抽取y份记录(即y份记录返回值为true)。y为NULL时,返回值为NULL。
  • partition by col1[, col2]:指定开窗口的列。

返回值:Boolean类型。

示例,如表test_tbl中有key,value两列,key为分组字段,值有groupa,groupb两组,value为值,如下

  1. +------------+--------------------+
  2. | key | value |
  3. +------------+--------------------+
  4. | groupa | -1.34764165478145 |
  5. | groupa | 0.740212609046718 |
  6. | groupa | 0.167537127858695 |
  7. | groupa | 0.630314566185241 |
  8. | groupa | 0.0112401388646925 |
  9. | groupa | 0.199165745875297 |
  10. | groupa | -0.320543343353587 |
  11. | groupa | -0.273930924365012 |
  12. | groupa | 0.386177958942063 |
  13. | groupa | -1.09209976687047 |
  14. | groupb | -1.10847690938643 |
  15. | groupb | -0.725703978381499 |
  16. | groupb | 1.05064697475759 |
  17. | groupb | 0.135751224393789 |
  18. | groupb | 2.13313102040396 |
  19. | groupb | -1.11828960785008 |
  20. | groupb | -0.849235511508911 |
  21. | groupb | 1.27913806620453 |
  22. | groupb | -0.330817716670401 |
  23. | groupb | -0.300156896191195 |
  24. | groupb | 2.4704244205196 |
  25. | groupb | -1.28051882084434 |
  26. +------------+--------------------+

想要从每组中抽取约10%的值,可以用以下MaxCompute SQL完成:

  1. select key, value
  2. from (
  3. select key, value, cluster_sample(10, 1) over(partition by key) as flag
  4. from tbl
  5. ) sub
  6. where flag = true;
  7. +--------+--------------------+
  8. | key | value |
  9. +--------+--------------------+
  10. | groupa | -1.34764165478145 |
  11. | groupb | -0.725703978381499 |
  12. | groupb | 2.4704244205196 |
  13. +-----+-----------------------+

聚合函数

聚合函数,其输入与输出是多对一的关系,即将多条输入记录聚合成一条输出值。可以与SQL中的group by语句联用。

COUNT

函数声明:

  1. bigint count([distinct|all] value)

用途:计算记录数。

参数说明:

  • distinct|all:指明在计数时是否去除重复记录,默认是all,即计算全部记录,如果指定distinct,则可以只计算唯一值数量。
  • value:可以为任意类型,当value值为NULL时,该行不参与计算,value可以为,当count()时,返回所有行数。

返回值:Bigint类型。

示例:

  1. -- 如表tbla有列col1类型为bigint
  2. +------+
  3. | COL1 |
  4. +------+
  5. | 1 |
  6. +------+
  7. | 2 |
  8. +------+
  9. | NULL |
  10. +------+
  11. select count(*) from tbla; -- 值为3,
  12. select count(col1) from tbla; -- 值为2

聚合函数可以和group by一同使用,例如:假设存在表test_src,存在如下两列:key string类型,value double类型,

  1. -- test_src的数据为
  2. +-----+-------+
  3. | key | value |
  4. +-----+-------+
  5. | a | 2.0 |
  6. +-----+-------+
  7. | a | 4.0 |
  8. +-----+-------+
  9. | b | 1.0 |
  10. +-----+-------+
  11. | b | 3.0 |
  12. +-----+-------+
  13. -- 此时执行如下语句,结果为:
  14. select key, count(value) as count from test_src group by key;
  15. +-----+-------+
  16. | key | count |
  17. +-----+-------+
  18. | a | 2 |
  19. +-----+-------+
  20. | b | 2 |
  21. +-----+-------+
  22. -- 聚合函数将对相同key值得value值做聚合计算。下面介绍的其他聚合函数使用方法均与此例相同,不一一举例。

AVG

函数声明:

  1. double avg(double value)

用途:计算平均值。

参数说明:

  • value:Double类型,若输入为string或bigint会隐式转换到double类型后参与运算,其它类型抛异常。当value值为NULL时,该行不参与计算。Boolean类型不允许参与计算。

返回值:Double类型。

示例:

  1. -- 如表tbla有一列value,类型为bigint
  2. +-------+
  3. | value |
  4. +-------+
  5. | 1 |
  6. | 2 |
  7. | NULL |
  8. +-------+
  9. -- 则对该列计算avg结果为(1+2)/2=1.5
  10. select avg(value) as avg from tbla;
  11. +------+
  12. | avg |
  13. +------+
  14. | 1.5 |
  15. +------+

MAX

函数声明:

  1. max(value)

用途:计算最大值。

参数说明:

  • value:可以为任意类型,当列中的值为NULL时,该行不参与计算。Boolean类型不允许参与运算。

返回值:与value类型相同。

示例:

  1. -- 如表tbla有一列col1,类型为bigint
  2. +------+
  3. | col1 |
  4. +------+
  5. | 1 |
  6. +------+
  7. | 2 |
  8. +------+
  9. | NULL |
  10. +------+
  11. select max(value) from tbla; -- 返回值为2

MIN

命令格式:

  1. MIN(value)

用途:计算最小值。

参数说明:

  • value:可以为任意类型,当列中的值为NULL时,该行不参与计算。Boolean类型不允许参与计算。

示例:

  1. -- 如表tbla有一列value,类型为bigint
  2. +------+
  3. | value|
  4. +------+
  5. | 1 |
  6. +------+
  7. | 2 |
  8. +------+
  9. | NULL |
  10. +------+
  11. select min(value) from tbla; -- 返回值为1

MEDIAN

函数声明:

  1. double median(double number)

用途:计算中位数。

参数说明:

  • number:Double类型。若输入为string类型或bigint类型会隐式转换到double类型后参与运算,其他类型抛异常。当输入值为NULL时忽略。

返回值:Double类型。

STDDEV

函数声明:

  1. double stddev(double number)

用途:计算总体标准差。

参数说明:

  • number:Double类型。若输入为string类型或bigint类型会隐式转换到double类型后参与运算,其他类型抛异常。当输入值为NULL时忽略。

返回值:Double类型。

STDDEV_SAMP

命令格式:

  1. double stddev_samp(double number)

用途:计算样本标准差。

参数说明:

  • number:Double类型。若输入为string类型或bigint类型会隐式转换到double类型后参与运算,其他类型抛异常。当输入值为NULL时忽略。

返回值:Double类型。

SUM

函数声明:

  1. sum(value)

用途:计算汇总值。

参数说明:

  • value:Double或bigint类型,若输入为string会隐式转换到double类型后参与运算,当列中的值为NULL时,该行不参与计算。Boolean类型不允许参与计算。

返回值:输入为bigint时返回bigint,输入为double或string时返回double类型。

示例:

  1. -- 如表tbla有一列value,类型为bigint
  2. +------+
  3. | value|
  4. +------+
  5. | 1 |
  6. +------+
  7. | 2 |
  8. +------+
  9. | NULL |
  10. +------+
  11. select sum(value) from tbla; -- 返回值为3

WM_CONCAT

函数声明:

  1. string wm_concat(string separator, string str)

用途:用指定的spearator做分隔符,链接str中的值。

参数说明:

  • separator:String类型常量,分隔符。其他类型或非常量将引发异常。
  • str:String类型,若输入为bigint,double或者datetime类型会隐式转换为string后参与运算,其它类型报异常。

返回值:String类型。

备注:

  • 对语句”select wm_concat(‘,’, name) from test_src;”,若test_src为空集合,这MaxCompute SQL条语句返回NULL值。聚合函数,其输入与输出是多对一的关系,即将多条输入记录聚合成一条输出值。可以与SQL中的group by语句联用。

其他函数

CAST

函数声明:

  1. cast(expr as <type>)

用途:将表达式的结果转换成目标类型,如cast(‘1’ as bigint)将字符串”1”转为整数类型的1,如果转换不成功或不支持的类型转换会引发异常。

备注:

  • cast(double as bigint),将double值转换成bigint。
  • cast(string as bigint) 在将字符串转为bigint时,如果字符串中是以整型表达的数字,会直接转为bigint类型。如果字符串中是以浮点数或指数形式表达的数字,则会先转为double类型,再转为bigint类型。
  • cast(string as datetime) 或 cast(datetime as string)时,会采用默认的日期格式yyyy-mm-dd hh:mi:ss。

COALESCE

函数声明:

  1. coalesce(expr1, expr2, ...)

用途:返回列表中第一个非NULL的值,如果列表中所有的值都是NULL则返回NULL。

参数说明:

  • expri是要测试的值。所有这些值类型必须相同或为NULL,否则会引发异常。

返回值:返回值类型和参数类型相同。

备注:

  • 参数至少要有一个,否则引发异常。

DECODE

函数声明:

  1. decode(expression, search, result[, search, result]...[, default])

用途:实现if-then-else分支选择的功能。

参数说明:

  • expression:要比较的表达式。
  • search:和expression进行比较的搜索项。
  • result:search和expression的值匹配时的返回值。
  • default:可选项,如果所有的搜索项都不匹配,则返回此default值,如果未指定,则会返回NULL。

返回值:返回匹配的search;如果没有匹配,返回default;如果没有指定default,返回NULL。

备注:

  • 至少要指定三个参数。
  • 所有的result类型必须一致,或为NULL。不一致的数据类型会引发异常。所有的search和expression类型必须一致,否则报异常。
  • 如果decode中的search选项有重复时且匹配时,会返回第一个值。

示例:

  1. select
  2. decode(customer_id,
  3. 1, 'Taobao',
  4. 2, 'Alipay',
  5. 3, 'Aliyun',
  6. NULL, 'N/A',
  7. 'Others') as result
  8. from sale_detail;

上面的decode函数实现了下面if-then-else语句中的功能:

  1. if customer_id = 1 then
  2. result := 'Taobao';
  3. elsif customer_id = 2 then
  4. result := 'Alipay';
  5. elsif customer_id = 3 then
  6. result := 'Aliyun';
  7. ...
  8. else
  9. result := 'Others';
  10. end if;

但需要用户注意的是,通常情况下MaxCompute SQL在计算NULL = NULL时返回NULL,但在decode函数中,NULL与NULL的值是相等的。在上述事例中,当customer_id的值为NULL时,decode函数返回”N/A”。

GREATEST

函数声明:

  1. greatest(var1, var2, …)

用途:返回输入参数中最大的一个。

参数说明:

  • var1,var2可以为bigint,double,datetime或者string。若所有值都为NULL则返回NULL。

返回值:

  • 输入参数中的最大值,当不存在隐式转换时返回同输入参数类型。
  • NULL为最小值。
  • 当输入参数类型不同时,double,bigint,string之间的比较转为double;string,datetime的比较转为datetime。不允许其它的隐式转换。

ORDINAL

函数声明:

  1. ordinal(bigint nth, var1, var2, …)

用途:将输入变量按从小到大排序后,返回nth指定的位置的值。

参数说明:

  • nth:Bigint类型,指定要返回的位置,为NULL时返回NULL。
  • var1,var2:类型可以为bigint,double,datetime或者string。

返回值:

  • 排在第nth位的值,当不存在隐式转换时返回同输入参数类型。
  • 有类型转换时,double,bigint,string之间的转换返回double。string,datetime之间的转换返回datetime。不允许其它的隐式转换。
  • NULL为最小。

示例:

  1. ordinal(3, 1, 3, 2, 5, 2, 4, 6) = 2

LEAST

函数声明:

  1. least(var1, var2, …)

用途:返回输入参数中最小的一个。

参数说明:

  • var1,var2可以为bigint,double,datetime或者string。若所有值都为NULL则返回NULL。

返回值:

  • 输入参数中的最小值,当不存在隐式转换时返回同输入参数类型。
  • NULL为最小。
  • 有类型转换时,double,bigint,string之间的转换返回double。string,datetime之间的转换返回datetime。不允许其它的隐式类型转换。

UUID

命令格式:

  1. string uuid()

用途:返回一个随机ID,形式示例:”29347a88-1e57-41ae-bb68-a9edbdd94212”。

SAMPLE

函数声明:

  1. boolean sample(x, y, column_name)

用途:对所有读入的column_name的值,sample根据x,y的设置做采样,并过滤掉不满足采样条件的行。

参数说明:

  • x,y:Bigint类型,表示哈希为x份,取第y份。y可省略,省略时取第一份,如果省略参数中的y,则必须同时省略column_name。x,y为整型常量,大于0,其它类型或小于等于0时抛异常,若y>x也抛异常。x,y任一输入为NULL时返回NULL。
  • column_name是采样的目标列。column_name可以省略,省略时根据x,y的值随机采样。任意类型,列的值可以为NULL。不做隐式类型转换。如果column_name为常量NULL会报异常。

返回值:Boolean类型。

备注:

  • 为了避免NULL值带来的数据倾斜,因此对于column_name中为NULL的值,会在x份中进行均匀哈希。如果不加column_name,则数据量比较少时输出不一定均匀,在这种情况下建议加上column_name,以获得比较好的输出结果。

示例:假定存在表tbla,表内有列名为cola的列,

  1. select * from tbla where sample (4, 1 , cola) = true;
  2. -- 表示数值会根据cola hash为4份,取第1份
  3. select * from tbla where sample (4, 2) = true;
  4. -- 表示数值会对每行数据做随机哈希分配为4份,取第2份

CASE WHEN表达式

MaxCompute提供两种case when语法格式,如下所述:

  1. case value
  2. when (_condition1) then result1
  3. when (_condition2) then result2
  4. ...
  5. else resultn
  6. end
  7. case
  8. when (_condition1) then result1
  9. when (_condition2) then result2
  10. when (_condition3) then result3
  11. ...
  12. else resultn
  13. end

case when表达式可以根据表达式value的计算结果灵活返回不同的值, 如以下语句根据shop_name的不同情况得出所属区域

  1. select
  2. case
  3. when shop_name is null then 'default_region'
  4. when shop_name like 'hang%' then 'zj_region'
  5. end as region
  6. from sale_detail;

说明:

  • 如果result类型只有bigint,double,统一转double再返回;
  • 如果result类型中有string类型,统一转string再返回,如果不能转则报错(如boolean型);
  • 除此之外不允许其它类型之间的转换;

IF

函数声明:

  1. if(testCondition, valueTrue, valueFalseOrNull)

用途:判断testCondition是否为真,如果为真,返回valueTrue,如果不满足则返回另一个值(valueFalse或者Null)。

参数说明:

  • testCondition:要判断的表达式, boolean类型;
  • valueTrue: 表达式testCondition为True的时候,返回的值。
  • valueFalseOrNull:不满足表达式testCondition时2,返回的值,可以设为Null.返回值:返回值类型和参数valueTrue或者valueFalseOrNul的类型一致。示例:
  1. select if(1=2,100,200) from dual;
  2. 返回值:
  3. +------------+
  4. | _c0 |
  5. +------------+
  6. | 200 |
  7. +------------+

最后更新:2016-11-23 17:16:09

  上一篇:go 内建函数-上__SQL_大数据计算服务-阿里云
  下一篇:go Java UDF__UDF_SQL_大数据计算服务-阿里云