hive-----行列互换

新建一张这样的表:

CREATE TABLE users (

  name string,

  game string,

  score double

);

insert into users values('us1','game1',2.0 ) ,

('us1','game2',3.0 ) ,

('us1','game3',5.0 ) ,

('us2','game2',4.0 ) ,

('us2','game3',3.0 ) ,

('us2','game4',7.0 ) ,

('us3','game4',3.0 ) ,

('us3','game5',5.0 ) ,

('us3','game6',4.0 );

现在要转换成下面这样:

执行语句:

 

#行转列

SELECT  name

        ,MAX( CASE WHEN game='game1' THEN score else 0 END) AS game1

        ,MAX( CASE WHEN game='game2' THEN score else 0 END) AS game2

        ,MAX( CASE WHEN game='game3' THEN score else 0 END) AS game3

        ,MAX( CASE WHEN game='game4' THEN score else 0 END) AS game4

        ,MAX( CASE WHEN game='game5' THEN score else 0 END) AS game5

        ,MAX( CASE WHEN game='game6' THEN score else 0 END) AS game6

FROM    users

GROUP BY name

;

 

下面有三种列转行的形式:

 

第一种:运用了collect_set()函数,可以的到一个数组

Sql如下:

select name,collect_set(game)

from users

group by name;

 

第二种:运用了collect_set()和concat_ws()函数,可以得到一个字符串

select name,concat_ws('|',collect_set(game))

from users

group by name;

 

第三种:直接把数组中的每个数据取出来当成一列

这里我还排序了,使数组中的数据是按score从大到小的顺序排的

 

select t.name,top3[0],top3[1],top3[2]

from

(

   select t.name,collect_set(t.game) top3

   from

   (

    select name,game,score,

    row_number() over(distribute by name sort by score desc)

    from users

   )t

group by t.name

)t;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值