蜂巢基于序列号的串联

时间:2019-02-06 06:51:33

标签: sql hive concat

我无法根据特定ID的序列号来连接字段。

id    field1   seq number
1       a            1
1       b            3
1       c            2
2       d            1
2       e            2

预期结果

id       field1   
1        acb   
2        de

3 个答案:

答案 0 :(得分:1)

使用collect_list将字符串聚合到数组中,并使用concat_ws连接数组。 collect_list正在使用ArrayList,它会按照插入顺序保留数据。在sort之前的子查询中使用collect_list对插入数组中的值进行排序。

在Hive中测试:

with s as --this is your data
(select stack(5,
              1,'a',1,
              1,'b',3,
              1,'c',2,
              2,'d',1,
              2,'e',2) as (id,field1,seq_number)
)

select s.id, concat_ws('',collect_list(s.field1)) as field1    
from 
 (select s.id, s.field1, s.seq_number from s sort by s.seq_number) s --SORT is here
group by s.id;

结果:

OK
id      field1
1       acb
2       de

答案 1 :(得分:0)

您可以使用递归功能获得所需的结果。但是请记住,如果数据的维数很高,请尝试另一种方法,因为在某些语言(例如SQL Server)中,递归函数的嵌套级别不超过32!

        Create Function function(@ID Int, @i Int)
        Returns VarChar(8000)
        As
        Begin
        -- variables for storing data and return values
            Declare @string VarChar(8000), @temp VarChar(8000)
            Select @i = @i-1, @string = Field1 + ', ' From dbo.Errors E1 Where Id = @ID And
            @i = (Select Count(*) From dbo.Errors E2 Where E2.Id = E1.Id and E2.Field1 <= E1.Field1);

            If @i > 0 
            Begin
                Exec @temp = dbo.function@ID, @i;
                -- concatenate values every time the funtion returns
                Set @string = @temp + @string
            End
               -- return the resulatant data;
            Return @r;                              
        End
        Go

您的函数需要通过以下方式调用:

     Select ID, dbo.function(ID, Count(Field1)) From dbo.Errors Group By ID;

希望这对您有帮助!

答案 2 :(得分:0)

here

SELECT ID ,(Select SUBSTRING(
(SELECT ',' + FIELD1 AS 'data()'
    FROM TABLE WHERE ID = table.ID
    FOR XML PATH('')
 ), 2 , 9999)) As FIELD1 
FROM table 
GROUP BY ID