строк с тем же первичным ключем.
Например
pk, attr
1, a
1, b
2, c
select pk, attr, accomulate(groupArray, attr) from tbl
1, a, [a, b]
1, b, [a, b]
2, c, [c]
Что-то похожее на lateral join и runningAccumulate
только ищущая по всем блокам, а не по текущему.
Строки с одним PK могут быть в разных блоках.
Можно такое сделать?
GROUP BY не ?
не тогда было бы 1, [a, b] 2, [c] а не 1, a, [a, b] 1, b, [a, b] 2, c, [c]
SELECT pk, groupArray(attr) FROM table GROUP BY a
select pk, attr, attrarr from ( select pk, groupArray(attr) attrarr from ( select 1 as pk, 'a' as attr UNION ALL select 1, 'b' UNION ALL select 2, 'c' ) group by pk ) array join attrarr as attr ; ┌─pk─┬─attr─┬─attrarr───┐ │ 1 │ a │ ['a','b'] │ │ 1 │ b │ ['a','b'] │ │ 2 │ c │ ['c'] │ └────┴──────┴───────────┘
я намерено написал: «Я для каждой строки хочу посчитать агрегационную функцию для строк с тем же первичным ключем.» Я хочу исходную таблицу фильтровать по pk и не pk. Т.е. я хочу отфильтровать табличку и прицепить к строкам ВСЕ строки с тем же pk. В том числе не попавшие под условие.
их придется фильтровать в arrayFilter уже либо в самом конце
ну вот в том то и проблема, что их много и я хочу сначала отфильтровать и потом подцепить а не выбрать очень-много-строк, сгруппировать и фильтровать.
select pk, attr, attrarr from ( select pk, groupArray(attr) attrarr from ( select 1 as pk, 'a' as attr UNION ALL select 1, 'b' UNION ALL select 2, 'c' ) group by pk ) array join attrarr as attr where attr!='b' ; ┌─pk─┬─attr─┬─attrarr───┐ │ 1 │ a │ ['a','b'] │ │ 2 │ c │ ['c'] │ └────┴──────┴───────────┘
where attr!='b' - как раз снаружи, а нужно внутри
тогда подзапросом... дайте сгенерированный селект из numbers с примерами фильтров. а то сложно угадывать
ну вы хотите при этом чтобы в массиве 'b' остался и не фильтровался же?
Например pk, attr 1, a 1, b 2, a select pk, attr, accumulate(groupArray, attr) from tbl where attr = 'a'; 1, a, [a, b] 2, a, [a]
оконные функции будут так же фильтровать внутри себя, это нормально. вам только с подзапросами
Обсуждают сегодня