Home > Software design >  how do i string_agg these accounts together?
how do i string_agg these accounts together?

Time:01-28

i've got a table that's kinda like this

id account
111111 333-333-2
111111 333-333-1
222222 444-444-1
222222 555-555-1
222222 555-555-2

and i'm trying to aggregate everything up to look like this

id account
111111 333-333-1, -2
222222 444-444-1, 555-555-1, -2

so far i've got this

SELECT 
id, 
CONCAT((STRING_AGG(DISTINCT SUBSTRING(account FROM '^(([^-]*-){2})'), ', ')), 
       (STRING_AGG(DISTINCT SUBSTRING(account FROM '[^-]*$'), ', '))) account
GROUP BY id

but this produces

id account
111111 333-333-1, 2
222222 444-444-, 555-555-1, 2

CodePudding user response:

, A AS (
SELECT id,
                SUBSTRING(account FROM '^(([^-]*-){2})') first_account,
                STRING_AGG(DISTINCT SUBSTRING(account FROM '[^-]*$'), ', ') second_account
FROM table         
GROUP BY id, first_account
)
select id, STRING_AGG(DISTINCT first_account || second_account, ', ')
FROM A
GROUP BY id

i ended up figuring it out and this worked for me :))

CodePudding user response:

I would suggest a different approach: first split the account numbers into main part and suffix, then do separate grouping operations on them:

SELECT
  id,
  string_agg(accounts, ', ') AS account
FROM (
  SELECT
    id,
    concat(account_main, string_agg(account_suffix, ', ')) AS accounts
  FROM (
    SELECT
      id,
      substr(account, 1, 7) AS account_main,
      substr(account, 8, 9) AS account_suffix
    FROM
      example
  ) AS t1
  GROUP BY
    id,
    account_main
) AS t2
GROUP BY
  id;
  • Related