hiveSql 重分组聚合问题

hiveSql 重分组聚合问题

问题

将下图中A表转变为B和C,即A->B A->C
在这里插入图片描述

分析

  • 1.首先看A->B,可见是将name列分组,取最大组内最大id。介绍两种求解方式:
    1)很容易想到,开窗函数first_value() over() 按照name分组取组内最大id,再按照最大id分组,聚合name即可;
    2)也容易想到直接按照name分组,求name个数,利用函数repeat按照每个name个数重复name即可,这里有连接符|有个小技巧,具体见sql实现。
  • 2.再看A->C,可见是将连续的name分为一组,取连续name分组内的最大id,很容易想到重分组解法,将不连续的部分计为1,sum() over()累加造是否是连续的分组字段,从而分组取组内最大id 和 串联拼接name

实现

  • 1.A->B:
    1)第一种分析思路解法:
select 
	flag as id
    ,concat_ws('|',collect_list(name)) as name
from(
    select id
          ,name
          ,first_value(id) over(partition by name order by cast(id as int) desc) as flag
    from tmp
	) t
group by flag

2)第二种分析思路解法:

select 
    max(id) as id
    ,regexp_replace(trim(repeat(concat(name,' '),count(1))),' ','|')as name
from tmp group by name

此处利用repeat()方法,重复name分组个数,按照空格连接,但是最后会多出一个空格,利用trim()将前后空格去除,再将空格替换为竖线连接name即可
结果:
在这里插入图片描述

  • 2.A->C:
select 
    max(t1.id) as id,
    wm_concat('|',t1.name) as name
from
    (select 
        id,name,sum(if(name = name1,0,1)) over(order by id) as flag
    from  
        (select 
            id,name,
            lag(name) over( order by id ) as name1
        from tmp
        ) t
    ) t1
group by t1.flag

结果:
在这里插入图片描述

最后

喜欢的点赞、关注、收藏吧~ 你的支持是最大的创作动力~~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@nanami

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值