1
votes

concaténation dans la ruche basée sur le numéro de séquence

Je ne parviens pas à concaténer un champ basé sur le numéro de séquence d'un identifiant spécifique.

id       field1   
1        acb   
2        de

résultat attendu

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


0 commentaires

3 Réponses :


0
votes

Vous pouvez utiliser la fonction récursive pour obtenir le résultat souhaité. Mais rappelez-vous si la dimension de vos données est élevée, alors essayez une autre approche, car dans certaines langues (par exemple, SQL Server) le niveau d'imbrication de la fonction récursive n'est pas supérieur à 32!

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

Et votre La fonction doit être invoquée en suivant:

        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

J'espère que cela vous aidera!


0 commentaires

1
votes

Utilisez collect_list pour agréger les chaînes dans un tableau et concat_ws pour concaténer un tableau. collect_list utilise ArrayList , il conserve les données dans l'ordre dans lequel elles ont été insérées. Utilisez sort dans la sous-requête avant collect_list pour trier les valeurs insérées dans le tableau.

Test dans Hive:

OK
id      field1
1       acb
2       de

Résultat:

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;


2 commentaires

Merci beaucoup. la liste de collecte peut-elle également être utilisée dans impala? ou y a-t-il un substitut au même


@HimanshuGarg Non, malheureusement, Impala n'a pas la même fonction collect_list, Impala a group_concat. Lisez ce Jira sur la commande et les informations de version: issues.apache.org/jira/browse/IMPALA -1458 , il s'agit également de la documentation de group_concat: cloudera.com/documentation/enterprise/5-5-x/topics/...



0
votes

Regardez ici < pré> XXX


0 commentaires