Добавить в корзинуПозвонить
Найти в Дзене

Виды соединений таблиц (3 часть): partitioned join

Данные зачастую хранятся в разреженом виде, когда в фактовой таблице нет строк под все возможные комбинации некоторых измерений. Например, если взять 2 измерения: дату и продукт, то в таблице с продажами может вполне не оказаться сбыта каких-то продуктов в некоторые дни. Однако, для целей аналитики данных, нам может понадобится увидеть эти данные в плотной форме, например чтобы для каждого дня месяца выводились продажи всех продуктов, не зависимо от того, были они или нет. Представление данных в таком виде так же облегчит использование оконных функций, потому что можно будет задать фиксированный размер окна. Для представления данных в плотной форме можно воспользоваться partitioned join. Соединение это внешнее. Возьмем для примера следующие таблицы с данными и датами: Как видно из картинки, таблица разрежена. Предположим, что нам нужно вывести продажи все продуктов за каждый день месяца, и 0 если их не было. Сделать это можно следующим запросом: Здесь таблица "p" - это таблица с проду
Пример разреженной информации
Пример разреженной информации

Данные зачастую хранятся в разреженом виде, когда в фактовой таблице нет строк под все возможные комбинации некоторых измерений. Например, если взять 2 измерения: дату и продукт, то в таблице с продажами может вполне не оказаться сбыта каких-то продуктов в некоторые дни. Однако, для целей аналитики данных, нам может понадобится увидеть эти данные в плотной форме, например чтобы для каждого дня месяца выводились продажи всех продуктов, не зависимо от того, были они или нет. Представление данных в таком виде так же облегчит использование оконных функций, потому что можно будет задать фиксированный размер окна.

Для представления данных в плотной форме можно воспользоваться partitioned join. Соединение это внешнее. Возьмем для примера следующие таблицы с данными и датами:

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

Запрос с партицированным соединением
Запрос с партицированным соединением

Здесь таблица "p" - это таблица с продуктами, таблица "а" - это таблица с нужными датами. После выбора основной таблицы, нужно прописать PARTITION BY и в скобках указать колонки по которым будут нарезаться порции. В данном примере, это название продукта - name, его уникальные значения будут скомбинированы со всеми значениям из опорной таблицы a. На выходе получим следующий результат:

Плотное соединение (dense join) используя partition by
Плотное соединение (dense join) используя partition by

Если бы мы воспользовались обычным внешним соединением, то получили бы следующую картину, где были бы выведены все даты из таблицы "а", но при этом только те продукты, которые были проданы в эти даты, из таблицы "p":

Обычное левое соеднение таблиц "a" и "p"
Обычное левое соеднение таблиц "a" и "p"

К сожалению данная фича реализована только на Оракле. Однако, запрос можно переписать, чтобы он выдавал тот же самый результат и без partition by.

Альтернативный запрос
Альтернативный запрос

В следующей стать рассмотрим lateral join.

Предыдущая статья: Виды соединений таблиц (2 часть): внешние/внутренние, using и natural join.