Обогащение данных — вычисляемые поля

Сейчас мы рассмотрим возможность создания различных вычисляемых полей на базе сервиса Analytic Workspace

Мы будем работать с данными, содержащими информацию о самых продаваемых книгах. Таблица будет содержать поля: название книги, автор, язык публикации, год публикации, объем продаж в миллионах, жанр.

Осмотрев данные, мы видим, что у нас есть целый ряд строковых полей и 2 числовых. Одно из числовых полей отвечает за год. С этим знанием перейдем к созданию полей.


Какие вычисляемые поля добавить?

1. Самый простой вариант — математическая операция.

Иногда нужно, чтобы новые данные были умножены на некий коэффициент или значение другого поля. В этом случае в вычисляемое поле необходимо без лишних дополнений вписать то выражение, которое вам необходимо.

Пример: получение результата продаж в единицах из миллионов.


2. Редакция строк

В вычисляемом поле может быть выражение, позволяющее форматировать текст внутри поля. Для нашего случая добавим поле, которое будет оставлять от имени автора только фамилию. Пример:

substr(author_s, instr(author_s, ' '))

Данный запрос состоит из нескольких функций:

instr(author_s, ' ') — возвращает индекс первого встретившегося в строке символа (символ указывается вторым параметром, в данном случае — пробел)

substr(author_s, instr(author_s, ' ')) — возвращает подстроку из строки author_s. Вторым параметром подается номер символа, с которого читаем до конца строки.

3. Добавление оконной функции

В поле “продажи в миллионах” хранится число продаж по каждой книге. Но важно отметить, что это число характеризует не только конкретную книгу.

Корректно было бы сказать, что число “200” характеризует в том числе какую-то часть некоторых других показателей.
А именно, часть:

  • продаж автора Чарльза Дикенса,
  • книг, написанных в 1859 году,
  • книг, жанра “историческая фантастика”

С помощью оконных функций мы можем создать агрегацию параметров, и полученный по группе результат записать в соседнем поле числом, при этом не изменяя внешнего вида таблицы.

Рассмотрим, как выглядит результат нахождения агрегации с использованием функции group by.

select author_s, sum(approximate_sales_in_millions)
from child
group by author_s

group by не допускает добавления в таблицу полей без агрегирующей функции. Поля, которые невозможно агрегировать — например, название книги — мы потеряем. При использовании оконных функций потерь не происходит, и в этом состоит их преимущество.

Как выглядят случаи, для которых полезна оконная функция?

  1. Например, мы хотим получить поле, которое показывало бы, сколько всего было продано книг за конкретным автором. И при этом не хотим группировать по автору, как на картинках выше.

Воспользуемся формулой:
sum(approximate_sales_in_millions) over (partition by author_s)


Новая часть для нас — over (partition by author_s). Она позволяет произвести агрегацию (в нашем случае суммирование) не всех значений вообще, а разделяя по авторам.

  1. Другой случай — итог с накоплением.

Попробуем проанализировать, как менялась динамика популярности автора с годами его публикаций. Для этого введем запрос, с помощью которого поле “накопление по автору” будет содержать не просто сумму всего, а только сумму продаж книг, написанных до определенного года.
Это будет выглядеть так.


sum(approximate_sales_in_millions) over (partition by author_s order by first_published)

Таким образом, имеем для 1942 — 10 млн, для 1947 — 10+12=22. Это и есть итог с накоплением. В оконной функции за такую функциональность будет отвечать параметр order by first_published

  1. Предыдущие два пункта можно расширить, если использовать не только агрегирующую функцию суммирования, но и другие.

avg() — нахождение среднего

min() — минимум

max() — максимум

count() — подсчет количества

И это только их небольшая часть.

Таким образом,

  1. Вычисляемые поля позволяют добавлять новые данные в таблицу, переиспользуя и преобразуя данные из исходных полей
  2. В вычисляемое поле можно записать математическое выражение или функцию, которая преобразует значение, хранящееся в поле.
  3. Оконные функции позволяют находить агрегаты данных, не меняя исходной структуры таблицы. Также только с помощью них возможно добавить итоги с накоплением.
1 лайк