2

I would like to use string_agg(column_name,',') on some IDs in a column from a SQL result set. I would be grouping by a single key, but also want to make sure each grouped set results in n rows being fed into the string_agg(column_name,',') function

Example:

create table #temp (first_name varchar(20), data_id char(3))
insert into #temp (first_name, data_id) values('jeff', 'XX1')
insert into #temp (first_name, data_id) values('jeff', 'X23')
insert into #temp (first_name, data_id) values('jeff', 'X87')
insert into #temp (first_name, data_id) values('jeff', 'X09')
insert into #temp (first_name, data_id) values('jeff', 'X15')

insert into #temp (first_name, data_id) values('bob', 'X76')
insert into #temp (first_name, data_id) values('bob', 'X17')
insert into #temp (first_name, data_id) values('bob', 'X98')
insert into #temp (first_name, data_id) values('bob', 'X99')

select * from #temp

first_name  data_id
      jeff      XX1
      jeff      X23
      jeff      X87
      jeff      X09
      jeff      X15
       bob      X76
       bob      X17
       bob      X98
       bob      X99

Ideal result I am trying to create for lets say, n = 3 rows string aggregated per group is below. in the event that there are <3 rows left for that particular first_name key, throw the remaining into the column.

I am trying to use a recursive CTE but can't quite wrap my head around it

first_name        data_id
      jeff    XX1,X23,X87
      jeff        X09,X15
       bob    X76,X17,X98
       bob            X99
Coldchain9
  • 1,373
  • 11
  • 31

1 Answers1

5
select  first_name
       ,string_agg(data_id, ',') as data_id
from    (
        select  *
                ,(row_number() over(partition by first_name order by data_id)-1)/3 as grp
        from     #temp
        ) t
group by first_name, grp
order by first_name
first_name data_id
bob X17,X76,X98
bob X99
jeff X09,X15,X23
jeff X87,XX1

Fiddle

DannySlor
  • 4,574
  • 1
  • 3
  • 11