0

J'essaie de former une transformation où j'ai besoin de concaténer chaque valeur de 10 lignes.Concat chaque n lignes dans pentaho

1ère étape: entrée de table (requête de Postgres DB: select id from tablename)

résultat de l'échantillon à partir de la requête ci-dessus:

    id 
00000191-555c-11e4-922d-29fb57a42e4c 
00000192-555c-11e4-922d-29fb57a42e4c 
00000193-555c-11e4-922d-29fb57a42e4c 
00000194-555c-11e4-922d-29fb57a42e4c 
00000195-555c-11e4-922d-29fb57a42e4c 
00000196-555c-11e4-922d-29fb57a42e4c 
00000197-555c-11e4-922d-29fb57a42e4c 
00000198-555c-11e4-922d-29fb57a42e4c 
00000199-555c-11e4-922d-29fb57a42e4c 
0000019a-555c-11e4-922d-29fb57a42e4c 
000001a3-3cf2-11e4-b398-e52ee0ec6a4c 
000002ad-3768-4242-88cf-96f27d0263af 
000003ea-26e3-11e4-ace7-15c7d609fa6e 
00000684-73fb-4d65-a502-87c4eb6607c1 
0000087a-f587-44fa-8e88-7bcae5bcb22c 
00000889-39c5-11e4-bd0e-c3f9d65ac856 
0000094c-be98-4456-8b49-6357a36581aa 
00000987-2f19-4574-ab85-6744a65ee4e3 
00000cd0-4097-11e4-a4e6-af71a3d902c0 
00000e1e-3b55-11e4-9897-d958d55e6784 

ici je dois concaténer chacun 10 rangées ids en une seule rangée. Par exemple. 1-10 identifiants de rangée dans une rangée, 11-20 rangs d'identification dans une autre rangée et ainsi de suite.

Résultats escomptés:

ids 

00000191-555c-11e4-922d-29fb57a42e4c,00000192-555c-11e4-922d-29fb57a42e4c,00000193-555c-11e4-922d-29fb57a42e4c,00000194-555c-11e4-922d-29fb57a42e4c,00000195-555c-11e4-922d-29fb57a42e4c,00000196-555c-11e4-922d-29fb57a42e4c,00000197-555c-11e4-922d-29fb57a42e4c,00000198-555c-11e4-922d-29fb57a42e4c,00000199-555c-11e4-922d-29fb57a42e4c,0000019a-555c-11e4-922d-29fb57a42e4c 
000001a3-3cf2-11e4-b398-e52ee0ec6a4c,000002ad-3768-4242-88cf-96f27d0263af,000003ea-26e3-11e4-ace7-15c7d609fa6e,00000684-73fb-4d65-a502-87c4eb6607c1,0000087a-f587-44fa-8e88-7bcae5bcb22c,00000889-39c5-11e4-bd0e-c3f9d65ac856,0000094c-be98-4456-8b49-6357a36581aa,00000987-2f19-4574-ab85-6744a65ee4e3,00000cd0-4097-11e4-a4e6-af71a3d902c0,00000e1e-3b55-11e4-9897-d958d55e6784 

Je sais par groupe ou un groupe mémoire par se concaténer les lignes, mais dans ce scénario puis-je utiliser si oui, comment puis-je l'utiliser.

S'il vous plaît aidez-moi avec ceci. Merci d'avance!

+0

Modifiez votre question et fournissez des exemples de données et les résultats souhaités. –

+0

@GordonLinoff a ajouté des données d'échantillon et la sortie attendue. J'espère que c'est compréhensible. – Arunraj

Répondre

0

comme ceci?

t=# \x 
Expanded display is on. 
t=# with a as 
(
    select ntile(2) over (order by id),id from tablename 
) 
select 
    string_agg(id,',') 
from a 
group by ntile; 
-[ RECORD 1 ]------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
string_agg | 00000191-555c-11e4-922d-29fb57a42e4c, 00000192-555c-11e4-922d-29fb57a42e4c, 00000193-555c-11e4-922d-29fb57a42e4c, 00000194-555c-11e4-922d-29fb57a42e4c, 00000195-555c-11e4-922d-29fb57a42e4c, 00000196-555c-11e4-922d-29fb57a42e4c, 00000197-555c-11e4-922d-29fb57a42e4c, 00000198-555c-11e4-922d-29fb57a42e4c, 00000199-555c-11e4-922d-29fb57a42e4c, 0000019a-555c-11e4-922d-29fb57a42e4c 
-[ RECORD 2 ]------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
string_agg | 000001a3-3cf2-11e4-b398-e52ee0ec6a4c, 000002ad-3768-4242-88cf-96f27d0263af, 000003ea-26e3-11e4-ace7-15c7d609fa6e, 00000684-73fb-4d65-a502-87c4eb6607c1, 0000087a-f587-44fa-8e88-7bcae5bcb22c, 00000889-39c5-11e4-bd0e-c3f9d65ac856, 0000094c-be98-4456-8b49-6357a36581aa, 00000987-2f19-4574-ab85-6744a65ee4e3, 00000cd0-4097-11e4-a4e6-af71a3d902c0, 00000e1e-3b55-11e4-9897-d958d55e6784 
+0

Ntile (2) ne regrouperait-il pas un nombre différent de lignes en fonction de la taille de l'ensemble de données? – user4637357

+0

sûrement - J'ai utilisé ntile (20/10) pour votre exemple –

+0

@VaoTsun que diriez-vous de la performance de la requête ci-dessus quand la table a des millions d'enregistrements? – Arunraj

1

Si vous ne disposez pas d'un champ approprié pour regrouper vos identifiants, créez-en un vous-même.

Dans ce cas, j'ajouterais des numéros de ligne dans la requête et les diviserais par 10 pour obtenir un groupe décent et facilement configurable.

select row_number()/10 + 1 OVER (ORDER BY id) as rnum, id from tablename ORDER BY rnum 

Cela devrait vous donner 10 lignes avec rnum 1, 10 lignes avec rnum 2, etc. Configurer ce champ comme le groupe par domaine et vous avez terminé.

+1

Vous pouvez également créer le champ de groupe dans PDI en combinant l'étape 'Ajouter une séquence', puis en divisant le compteur par 10 dans les étapes' Calculator', UDJC, Java script ou Java. La méthode PDI est plus maladroite, mais pourrait être utile, si vous avez besoin d'utiliser d'autres sources de données. – user4637357

+1

BTW, vous devrez vous assurer que l'entrée pour l'étape Group By est triée sur les champs de groupe afin d'obtenir des agrégations correctes. Donc, vous êtes mieux d'inclure ORDER BY id ou ORDER BY rnum à la requête ci-dessus. Je ne pense pas que PostgreSQL offre des garanties de tri pour les valeurs row_number dans le cas général. – user4637357

+0

@ user4637357 Je vais l'ajouter à la réponse, mais la commande se passe pendant la fonction de fenêtrage, donc cela ne devrait pas être nécessaire. L'optimiseur ne réorganiserait pas les enregistrements sans d'autres opérations spécifiées. Au moins, je n'ai jamais vu cela se produire dans d'autres SGBDR. – Cyrus

0

Je pense que la solution est:

select string_agg(id, ',') 
from (select t.*, row_number() over (order by id) - 1 as seqnum 
     from t 
    ) t 
group by floor(seqnum/10); 

Bien que cela utilise string_agg(), je serais probablement utiliser des tableaux pour le résultat.