Как применить одну функцию к нескольким колонкам, не перечисляя их в SELECT

В прошлом посте я рассказывал про модификатор REPLACE, с помощью которого можно менять значения «на лету», не перечисляя все колонки в SELECT. Сегодня расскажу про еще один полезный модификатор — APPLY.
Иногда бывают ситуации, когда нам нужно применить одну и ту же функцию сразу к нескольким колонкам (например, посчитать сумму).
В классических транзакционных базах, таких как PostgreSQL, мы бы вручную перечисляли в SELECT абсолютно все поля, которые хотим просуммировать.
В ClickHouse это делается проще.
Чтобы не писать десятки колонок руками, можно использовать модификатор APPLY. Он работает в связке со звездочкой * и автоматически применяет указанную функцию ко всем колонкам в выборке.
В качестве примера рассмотрим таблицу metrics, в которой хранится количество кликов, просмотров и затрат:
┌─clicks─┬─views─┬─spend─┐ │ 10 │ 100 │ 50 │ │ 15 │ 150 │ 70 │ └────────┴───────┴───────┘
Чтобы посчитать сумму по каждому полю обычно мы привыкли писать так:
SELECT sum(clicks), sum(views), sum(spend) FROM metrics ┌─sum(clicks)┬─sum(views)─┬─sum(spend)─┐ │ 25 │ 250 │ 120 │ └────────────┴────────────┴────────────┘
С использованием APPLY можно написать короче:
SELECT * APPLY(sum) FROM metrics ┌─sum(clicks)┬─sum(views)─┬─sum(spend)─┐ │ 25 │ 250 │ 120 │ └────────────┴────────────┴────────────┘
Несколько нюансов:
Правила вызова пишутся в круглых скобках. Синтаксис такой:
APPLY(имя_функции)без аргументов.Передаваемая функция в
APPLYдолжна уметь работать со всеми полями выборки и их типами данных. Например, дляsumвсе поля должны быть числовыми.Если мы хотим применить
sum, но в таблице есть нечисловые типы данных, мы можем исключить их черезEXCEPTили выбрать только нужные через модификаторCOLUMNS, о котором я расскажу в следующем посте.APPLYможно использовать не только для агрегации, но и для изменения типов данных. Например,APPLY(toString)быстро переведет все выбранные колонки в строковый формат.
Ссылка на доку.
Мои статьи по ClickHouse на Хабре.
P.S. Систематизировать знания и получить крепкую базу можно на моем бесплатном курсе «ClickHouse с нуля». А закрепить пройденный материал на его практическом продолжении «ClickHouse с нуля: практика».











