将expr1, ..., exprk
分割为n行,除非另有说明,否则输出结果使用默认的列名col0、col1...
。
命令格式
stack(n, expr1, ..., exprk)
参数说明
n:必填。分割的行数。
expr:必填。待分割的参数。
expr1, ..., exprk
必须是整型,且参数数目必须是n的整数倍,需要能分割为完整的n行,否则返回报错。
返回值说明
返回n行,列数为参数数量除以n的商的数据集。
使用示例
--将1, 2, 3, 4, 5, 6排为3行。
select stack(3, 1, 2, 3, 4, 5, 6);
--返回结果如下。
+------+------+
| col0 | col1 |
+------+------+
| 1 | 2 |
| 3 | 4 |
| 5 | 6 |
+------+------+
--将'A',10,date '2015-01-01','B',20,date '2016-01-01'排为两行.
select stack(2,'A',10,date '2015-01-01','B',20,date '2016-01-01') as (col0,col1,col2);
--返回结果如下。
+------+------+------+
| col0 | col1 | col2 |
+------+------+------+
| A | 10 | 2015-01-01 |
| B | 20 | 2016-01-01 |
+------+------+------+
--将a、b、c、d排列为两行,源表如果有多行,按行执行stack的分行处理。
select stack(2,a,b,c,d) as (col,value)
from values
(1,1,2,3,4),
(2,5,6,7,8),
(3,9,10,11,12),
(4,13,14,15,null)
as t(key,a,b,c,d);
--返回结果如下。
+------+-------+
| col | value |
+------+-------+
| 1 | 2 |
| 3 | 4 |
| 5 | 6 |
| 7 | 8 |
| 9 | 10 |
| 11 | 12 |
| 13 | 14 |
| 15 | NULL |
+------+-------+
--配合lateral view使用。
select tf.* from (select 0) t lateral view stack(2,'A',10,date '2015-01-01','B',20, date '2016-01-01') tf as col0,col1,col2;
--返回结果如下。
+------+------+------+
| col0 | col1 | col2 |
+------+------+------+
| A | 10 | 2015-01-01 |
| B | 20 | 2016-01-01 |
+------+------+------+
相关函数
STACK函数属于其他函数,更多其他业务场景的函数请参见其他函数。