我无法根据特定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
答案 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