全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
MaxCompute

窗口函数

更新时间:2017-10-11 14:06:33

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 亿行数据(建议不超过 500 万行),否则运行时报错。

  • 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 类型,Decimal 类型。若输入为 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 时,返回 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('1\01') 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])
  3. Decimal STDDEV_SAMP([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 类型。

注意:

当指定 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 类型或 Decimal 类型或 Bigint 类型,当输入为 String 时,隐式转换为 Double 参与运算,其它类型报异常。当值为 null 时,该行不参与计算。指定 distinct 关键字时,表示计算唯一值的汇总值。

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

  • order by col1 [asc|desc], col2[asc|desc]:不指定 order by 时,返回当前窗口内 expr 的汇总值。指定 order by 时,返回结果以指定的方式排序,并且返回当前窗口从首行至当前行的累计汇总值。

返回值

输入参数是 Bigint 返回 Bigint,输入参数为 Decimal 类型时,返回 Decimal 类型,输入参数为 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 类型。

示例如下

假设表 emp 中的数据如下所示:

  1. | empno | ename | job | mgr | hiredate| sal| comm | deptno |
  2. 7369,SMITH,CLERK,7902,1980-12-17 00:00:00,800,,20
  3. 7499,ALLEN,SALESMAN,7698,1981-02-20 00:00:00,1600,300,30
  4. 7521,WARD,SALESMAN,7698,1981-02-22 00:00:00,1250,500,30
  5. 7566,JONES,MANAGER,7839,1981-04-02 00:00:00,2975,,20
  6. 7654,MARTIN,SALESMAN,7698,1981-09-28 00:00:00,1250,1400,30
  7. 7698,BLAKE,MANAGER,7839,1981-05-01 00:00:00,2850,,30
  8. 7782,CLARK,MANAGER,7839,1981-06-09 00:00:00,2450,,10
  9. 7788,SCOTT,ANALYST,7566,1987-04-19 00:00:00,3000,,20
  10. 7839,KING,PRESIDENT,,1981-11-17 00:00:00,5000,,10
  11. 7844,TURNER,SALESMAN,7698,1981-09-08 00:00:00,1500,0,30
  12. 7876,ADAMS,CLERK,7788,1987-05-23 00:00:00,1100,,20
  13. 7900,JAMES,CLERK,7698,1981-12-03 00:00:00,950,,30
  14. 7902,FORD,ANALYST,7566,1981-12-03 00:00:00,3000,,20
  15. 7934,MILLER,CLERK,7782,1982-01-23 00:00:00,1300,,10
  16. 7948,JACCKA,CLERK,7782,1981-04-12 00:00:00,5000,,10
  17. 7956,WELAN,CLERK,7649,1982-07-20 00:00:00,2450,,10
  18. 7956,TEBAGE,CLERK,7748,1982-12-30 00:00:00,1300,,10

现在需要将所有职工根据部门分组,每个组内根据 SAL 做降序排序,获得职工自己组内的序号。

  1. SELECT deptno
  2. , ename
  3. , sal
  4. , DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) AS nums--deptno(部门)作为开窗列,sal(薪水)作为结果返回时需要排序的值。
  5. FROM emp;
  6. --执行结果如下:
  7. +------------+-------+------------+------------+
  8. | deptno | ename | sal | nums |
  9. +------------+-------+------------+------------+
  10. | 10 | JACCKA | 5000.0 | 1 |
  11. | 10 | KING | 5000.0 | 1 |
  12. | 10 | CLARK | 2450.0 | 2 |
  13. | 10 | WELAN | 2450.0 | 2 |
  14. | 10 | TEBAGE | 1300.0 | 3 |
  15. | 10 | MILLER | 1300.0 | 3 |
  16. | 20 | SCOTT | 3000.0 | 1 |
  17. | 20 | FORD | 3000.0 | 1 |
  18. | 20 | JONES | 2975.0 | 2 |
  19. | 20 | ADAMS | 1100.0 | 3 |
  20. | 20 | SMITH | 800.0 | 4 |
  21. | 30 | BLAKE | 2850.0 | 1 |
  22. | 30 | ALLEN | 1600.0 | 2 |
  23. | 30 | TURNER | 1500.0 | 3 |
  24. | 30 | MARTIN | 1250.0 | 4 |
  25. | 30 | WARD | 1250.0 | 4 |
  26. | 30 | JAMES | 950.0 | 5 |
  27. +------------+-------+------------+------------+

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 类型。

示例如下

假设表 emp 中的数据如下所示:

  1. | empno | ename | job | mgr | hiredate| sal| comm | deptno |
  2. 7369,SMITH,CLERK,7902,1980-12-17 00:00:00,800,,20
  3. 7499,ALLEN,SALESMAN,7698,1981-02-20 00:00:00,1600,300,30
  4. 7521,WARD,SALESMAN,7698,1981-02-22 00:00:00,1250,500,30
  5. 7566,JONES,MANAGER,7839,1981-04-02 00:00:00,2975,,20
  6. 7654,MARTIN,SALESMAN,7698,1981-09-28 00:00:00,1250,1400,30
  7. 7698,BLAKE,MANAGER,7839,1981-05-01 00:00:00,2850,,30
  8. 7782,CLARK,MANAGER,7839,1981-06-09 00:00:00,2450,,10
  9. 7788,SCOTT,ANALYST,7566,1987-04-19 00:00:00,3000,,20
  10. 7839,KING,PRESIDENT,,1981-11-17 00:00:00,5000,,10
  11. 7844,TURNER,SALESMAN,7698,1981-09-08 00:00:00,1500,0,30
  12. 7876,ADAMS,CLERK,7788,1987-05-23 00:00:00,1100,,20
  13. 7900,JAMES,CLERK,7698,1981-12-03 00:00:00,950,,30
  14. 7902,FORD,ANALYST,7566,1981-12-03 00:00:00,3000,,20
  15. 7934,MILLER,CLERK,7782,1982-01-23 00:00:00,1300,,10
  16. 7948,JACCKA,CLERK,7782,1981-04-12 00:00:00,5000,,10
  17. 7956,WELAN,CLERK,7649,1982-07-20 00:00:00,2450,,10
  18. 7956,TEBAGE,CLERK,7748,1982-12-30 00:00:00,1300,,10

现在需要将所有职工根据部门分组,每个组内根据 SAL 做降序排序,获得职工自己组内的序号。

  1. SELECT deptno
  2. , ename
  3. , sal
  4. , RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) AS nums--deptno(部门)作为开窗列,sal(薪水)作为结果返回时需要排序的值。
  5. FROM emp;
  6. --执行结果如下:
  7. +------------+-------+------------+------------+
  8. | deptno | ename | sal | nums |
  9. +------------+-------+------------+------------+
  10. | 10 | JACCKA | 5000.0 | 1 |
  11. | 10 | KING | 5000.0 | 1 |
  12. | 10 | CLARK | 2450.0 | 3 |
  13. | 10 | WELAN | 2450.0 | 3 |
  14. | 10 | TEBAGE | 1300.0 | 5 |
  15. | 10 | MILLER | 1300.0 | 5 |
  16. | 20 | SCOTT | 3000.0 | 1 |
  17. | 20 | FORD | 3000.0 | 1 |
  18. | 20 | JONES | 2975.0 | 3 |
  19. | 20 | ADAMS | 1100.0 | 4 |
  20. | 20 | SMITH | 800.0 | 5 |
  21. | 30 | BLAKE | 2850.0 | 1 |
  22. | 30 | ALLEN | 1600.0 | 2 |
  23. | 30 | TURNER | 1500.0 | 3 |
  24. | 30 | MARTIN | 1250.0 | 4 |
  25. | 30 | WARD | 1250.0 | 4 |
  26. | 30 | JAMES | 950.0 | 6 |
  27. +------------+-------+------------+------------+

LAG

函数声明

  1. lag(exprBigint 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 类型。

示例如下

假设表 emp 中的数据如下所示:

  1. | empno | ename | job | mgr | hiredate| sal| comm | deptno |
  2. 7369,SMITH,CLERK,7902,1980-12-17 00:00:00,800,,20
  3. 7499,ALLEN,SALESMAN,7698,1981-02-20 00:00:00,1600,300,30
  4. 7521,WARD,SALESMAN,7698,1981-02-22 00:00:00,1250,500,30
  5. 7566,JONES,MANAGER,7839,1981-04-02 00:00:00,2975,,20
  6. 7654,MARTIN,SALESMAN,7698,1981-09-28 00:00:00,1250,1400,30
  7. 7698,BLAKE,MANAGER,7839,1981-05-01 00:00:00,2850,,30
  8. 7782,CLARK,MANAGER,7839,1981-06-09 00:00:00,2450,,10
  9. 7788,SCOTT,ANALYST,7566,1987-04-19 00:00:00,3000,,20
  10. 7839,KING,PRESIDENT,,1981-11-17 00:00:00,5000,,10
  11. 7844,TURNER,SALESMAN,7698,1981-09-08 00:00:00,1500,0,30
  12. 7876,ADAMS,CLERK,7788,1987-05-23 00:00:00,1100,,20
  13. 7900,JAMES,CLERK,7698,1981-12-03 00:00:00,950,,30
  14. 7902,FORD,ANALYST,7566,1981-12-03 00:00:00,3000,,20
  15. 7934,MILLER,CLERK,7782,1982-01-23 00:00:00,1300,,10
  16. 7948,JACCKA,CLERK,7782,1981-04-12 00:00:00,5000,,10
  17. 7956,WELAN,CLERK,7649,1982-07-20 00:00:00,2450,,10
  18. 7956,TEBAGE,CLERK,7748,1982-12-30 00:00:00,1300,,10

现在需要将所有职工根据部门分组,每个组内根据 SAL 做降序排序,获得职工自己组内的序号。

  1. SELECT deptno
  2. , ename
  3. , sal
  4. , ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal DESC) AS nums--deptno(部门)作为开窗列,sal(薪水)作为结果返回时需要排序的值。
  5. FROM emp;
  6. --执行结果如下:
  7. +------------+-------+------------+------------+
  8. | deptno | ename | sal | nums |
  9. +------------+-------+------------+------------+
  10. | 10 | JACCKA | 5000.0 | 1 |
  11. | 10 | KING | 5000.0 | 2 |
  12. | 10 | CLARK | 2450.0 | 3 |
  13. | 10 | WELAN | 2450.0 | 4 |
  14. | 10 | TEBAGE | 1300.0 | 5 |
  15. | 10 | MILLER | 1300.0 | 6 |
  16. | 20 | SCOTT | 3000.0 | 1 |
  17. | 20 | FORD | 3000.0 | 2 |
  18. | 20 | JONES | 2975.0 | 3 |
  19. | 20 | ADAMS | 1100.0 | 4 |
  20. | 20 | SMITH | 800.0 | 5 |
  21. | 30 | BLAKE | 2850.0 | 1 |
  22. | 30 | ALLEN | 1600.0 | 2 |
  23. | 30 | TURNER | 1500.0 | 3 |
  24. | 30 | MARTIN | 1250.0 | 4 |
  25. | 30 | WARD | 1250.0 | 5 |
  26. | 30 | JAMES | 950.0 | 6 |
  27. +------------+-------+------------+------------+

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 | 0.167537127858695 |
  11. | groupb | 0.135751224393789 |
  12. +-----+------------+
本文导读目录