Перейти к основному содержимому
Версия: 5.x

Оператор PARTITION

Оператор PARTITION - создание свойства, реализующего разбиение / упорядочивание либо простое распределение.

Синтаксис

Существует два разных вида оператора PARTITION. Первый из них реализует разбиение / упорядочивание:

PARTITION 
type expr
[ORDER [DESC] orderExpr1, ..., orderExprK]
[BY groupExpr1, ..., groupExprM]

Второй реализует простое распределение:

PARTITION 
UNGROUP propertyId distributionType expr
[ORDER [DESC] orderExpr1, ..., orderExprK]
[BY groupExpr1, ..., groupExprM]

где distributionType может быть описан несколькими способами:

PROPORTION [STRICT] ROUND(digits)
LIMIT [STRICT]

Описание

Оператор PARTITION создает свойство, разбивающее все наборы объектов в системе на группы, и с учетом заданного порядка :

  • вычисляет для каждого набора объектов агрегирующую функцию в случае разбиения / упорядочивания
  • распределяет некоторое значение среди наборов объектов одной группы в случае распределения.

Блок BY описывает группы, на которые будет разбиваться множество наборов объектов. Если блок BY не указывается, то считается, что все наборы объектов входят в одну группу.

Блок ORDER определяет порядок, в котором будет либо вычисляться агрегирующая функция, либо проходить распределение. Если эта функция некоммутативна, заданный порядок должен быть однозначно определяемым. Если в выражениях, задающих порядок, объявляется новый параметр (не встречавшийся ранее в опциях PARTITION и BY и в верхнем контексте), то при вычислении результирующего значения автоматически добавляется условие на не NULL всех этих выражений.

Параметры

  • type

    Тип агрегирующей функции. На данный момент поддерживаются типы агрегирующих функций SUM и PREV.

  • propertyId

    Идентификатор распределяемого свойства. Значение этого свойства должно быть числового типа, а количество параметров должно совпадать с количеством группировок в блоке BY. При выполнении на вход этому свойству будут переданы объекты, идентифицирующие некоторую группу наборов объектов.

  • distributionType

    Тип распределения. Бывают следующих видов:

    • PROPORTION

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

      • STRICT

        Ключевое слово, при указании которого значение распределяемого свойства должно быть точно (без остатка) расписано по наборам объектов, входящих в группу. Если в результате распределения остается некоторый остаток (который может быть и отрицательным), то он будет добавлен первому набору объектов в соответствии с указанным порядком в блоке ORDER.

      • ROUND(digits)

        Указывает до какого знака будет округлено значение свойства.

        digits - Целочисленный литерал, указывающий количество знаков после запятой.

    • LIMIT

      Ключевое слово, указывающее на использование распределения с указанными лимитами. В этом случае значение распределяемого свойства сначала устанавливается для первого из наборов объектов, если для этого набора превышается лимит, то для первого набора объектов устанавливается этот лимит, а остаток значения распределяемого свойства устанавливается для второго набора объектов, затем проверяется на превышение лимита для второго набора объектов и т. д. Лимит задается выражением expr, указываемым после указания типа распределения

      • STRICT

        Ключевое слово, при указании которого значение распределяемого свойства должно быть точно (без остатка) расписано по наборам объектов, входящих в группу. Если в результате распределении остается некоторый остаток, то он будет добавлен последнему набору объектов в соответствии с указанным порядком в блоке ORDER.

  • expr

    Выражение, значение которого идет на вход агрегирующей функции в качестве операнда в случае разбиения / упорядочивания. В случае распределения с типом PROPORTION определяет пропорцию, а с типом LIMIT определяет лимиты.

  • groupExpr1, ..., groupExprM

    Список группировочных выражений (группировок).

  • DESC

    Ключевое слово. Указывает на обратный порядок просмотра наборов объектов.

  • orderExpr1, ..., orderExprK

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

Примеры

// определяет место команды в конференции
CLASS Conference;
conference = DATA Conference (Team);
points = DATA INTEGER (Team);
gamesWon = DATA INTEGER (Team);
place 'Место' (Team team) = PARTITION SUM 1 ORDER DESC points(team), gamesWon(team) BY conference(team);

// строим порядковые индексы объектов в базе по возрастанию их внутренних идентификаторов (то есть в порядке создания)
index 'Номер' (Object o) = PARTITION SUM 1 IF o IS Object ORDER o;

// находит команду, следующую в турнирной таблице по конференции
prevTeam (Team team) = PARTITION PREV team ORDER place(team), team BY conference(team);

// пример пропорционального распределения
CLASS Order;
transportSum 'Транспортные расходы' = DATA NUMERIC[10,2] (Order);

CLASS OrderDetail;
order = DATA Order (OrderDetail) NONULL DELETE;
sum = DATA NUMERIC[14,2] (OrderDetail);

transportSum 'Транспортные расходы по строке' (OrderDetail d) = PARTITION UNGROUP transportSum
PROPORTION STRICT ROUND(2) sum(d)
ORDER d
BY order(d);

// пример распределения с лимитами
discountSum 'Скидка' = DATA NUMERIC[10,2] (Order);
discountSum 'Скидка по строке' (OrderDetail d) =
PARTITION UNGROUP discountSum
LIMIT STRICT sum(d)
ORDER sum(d), d
BY order(d);
;