窗口函数和行转列

窗口函数语法

<窗口函数> over ( [partition by <列清单>]

order by <排序用列清单>)

partition by 相当于sql中的group by,区别是partition by并不会减少原表中记录的行数,并不具备GROUP BY 子句的汇总功能,group by结果分组之后每组只有一条数据

能够作为窗口函数使用的函数

① 能够作为窗口函数的聚合函数( SUM 、 AVG 、 COUNT 、 MAX 、 MIN )

②  RANK 、 DENSE _ RANK 、 ROW _ NUMBER 等专用窗口函数

RANK 函数

计算排序时,如果存在相同位次的记录,则会跳过之后的位次。

例)有 3 条记录排在第 1 位时:1 位、1 位、1 位、4 位……

DENSE_RANK 函数

同样是计算排序,即使存在相同位次的记录,也不会跳过之后的位次。

例)有 3 条记录排在第 1 位时:1 位、1 位、1 位、2 位……

ROW_NUMBER 函数

赋予唯一的连续位次。

例)有 3 条记录排在第 1 位时:1 位、2 位、3 位、4 位……


行转列

用union

或者

select user_id,order_value,order_id

from lie_col

lateral view explode(split(order_value,',')) num as order_id

limit 10;

列转行

用case when

CASE WHEN < 求值表达式 > THEN < 表达式 >

WHEN < 求值表达式 > THEN < 表达式 >

WHEN < 求值表达式 > THEN < 表达式 >

...

else<表达式>

END

或者

select user_id,

concat_ws(',',collect_list(order_id)) as order_value

from col_lie

group by user_id

limit 10;

备注:collect_list不去重,collect_set去重。column的数据类型是String

你可能感兴趣的:(窗口函数和行转列)