Это настоящая боль. Один метод использует lead()
, чтобы объединить три значения, а затем отфильтровать значения для каждого третьего:
select x,
group_concat(col_3 separator '; ')
from (select t.x,
concat_ws(', ',
col,
lead(col, 1) over (order by ?),
lead(col, 2) over (order by ?)
) as col_3
row_number() over (partition by x order by ?) as seqnum
from t
) t
where mod(seqnum, 3) = 1
group by x;
Если вы хотите другие агрегации, вы можете отфильтровать в group_concat()
вместо:
select x,
group_concat(case when mod(seqnum, 3) = 1 then col_3 end separator '; ')