Hive 按分组聚合字符串,并在配置单元和Presto中排序

Hive 按分组聚合字符串,并在配置单元和Presto中排序,hive,hiveql,presto,Hive,Hiveql,Presto,我有以下格式的表格: IDX IDY Time Text idx1 idy1 t1 text1 idx1 idy2 t2 text2 idx1 idy2 t3 text3 idx1 idy1 t4 text4 idx2 idy3 t5 text5 idx2 idy3 t6 text6 idx2 idy1 t7 text7 idx2 idy3 t8 text8 我想看到的是这样的东西: idx1 text1 idx1 text2, text3 idx1 text4 idx2 text5, tex

我有以下格式的表格:

IDX IDY Time Text
idx1 idy1 t1 text1
idx1 idy2 t2 text2
idx1 idy2 t3 text3
idx1 idy1 t4 text4
idx2 idy3 t5 text5
idx2 idy3 t6 text6
idx2 idy1 t7 text7
idx2 idy3 t8 text8
我想看到的是这样的东西:

idx1 text1
idx1 text2, text3
idx1 text4
idx2 text5, text6
idx2 text7
idx2 text8
因此,在最后阶段,我可以:

text1
text2, text3
text4
==SEPERATOR==
text5, text6
text7
text8
我如何在蜂箱或Presto中执行此操作?谢谢。

Hive

这是基本查询,如果您愿意,可以从这里获取它

select  IDX
       ,IDY
       ,min(time)                           as from_time
       ,max(time)                           as to_time
       ,concat_ws(',',collect_list (Text))  as text

from   (select  *
               ,row_number () over 
                (
                    partition by    IDX
                    order by        Time
                )   as rn
               ,row_number () over 
                (
                    partition by    IDX,IDY
                    order by        Time
                )   as rn_IDY

        from    mytable
        ) t

group by    IDX,IDY
           ,rn - rn_IDY

order by    IDX,from_time

Presto

select  array_join(array_agg (Text),',')   as text

from   (select  *
               ,row_number () over 
                (
                    partition by    IDX
                    order by        Time
                )   as rn
               ,row_number () over 
                (
                    partition by    IDX,IDY
                    order by        Time
                )   as rn_IDY

        from    mytable
        ) t

group by    IDX,IDY
           ,rn - rn_IDY

order by    IDX,min(time)
;

蜂巢

这是基本查询,如果您愿意,可以从这里获取它

select  IDX
       ,IDY
       ,min(time)                           as from_time
       ,max(time)                           as to_time
       ,concat_ws(',',collect_list (Text))  as text

from   (select  *
               ,row_number () over 
                (
                    partition by    IDX
                    order by        Time
                )   as rn
               ,row_number () over 
                (
                    partition by    IDX,IDY
                    order by        Time
                )   as rn_IDY

        from    mytable
        ) t

group by    IDX,IDY
           ,rn - rn_IDY

order by    IDX,from_time

Presto

select  array_join(array_agg (Text),',')   as text

from   (select  *
               ,row_number () over 
                (
                    partition by    IDX
                    order by        Time
                )   as rn
               ,row_number () over 
                (
                    partition by    IDX,IDY
                    order by        Time
                )   as rn_IDY

        from    mytable
        ) t

group by    IDX,IDY
           ,rn - rn_IDY

order by    IDX,min(time)
;


==分隔符==
idx2 idy3 t5
重复两次。分离器是任何类型的分离器管路。它用于分隔IDX。在SQL中进行这种格式化没有多大意义
==separator==
idx2 idy3 t5
重复两次。分离器是任何类型的分离器管路。它用于分隔IDX。在SQL中进行这种格式化没有多大意义