Rambler's Top100

(c)2009-2017 openinfotech.ru

СУБД HyTech

Документация
Группы

Операции над группами

Часто бывает необходимо "обсчитать" значения поля на некотором подмножестве записей, разбив множество на группы. Например, подсчитать среднюю заработную плату по отделам предприятия. Это можно сделать так: найти записи для первого отдела и подсчитать для них среднее, затем для второго и т.п. Очевидно, что при достаточно большом числе обсчитываемых подмножеств операция потребует больших временных затрат. Для выполнения подобных "групповых" операций имеются специальные функции, которые позволяют обсчитать значения элемента(ов) за один проход, разбив исходной множество записей на группы.

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

 typedef struct tagGRP {
     int depart;   /* номер отдела */
     long average; /* средняя зарплата */
     long count;   /* число работников */
 } GRP;

Функциями, вычисляемыми для группы, могут быть:

  • среднее значение поля в группе;
  • число значений поля в группе;
  • максимальное значение поля в группе;
  • минимальное значение поля в группе;
  • сумма значений поля для группы;
  • число уникальных значений поля в группе;
  • первое значение поля для группы;
  • последнее значение поля для группы.

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

  • среднее значение (long/unsigned long/double);
  • подсчет числа значений (всегда long);
  • максимальное значение (по типу поля);
  • минимальное значение (по типу поля);
  • сумма значений (long/unsigned long/double);
  • подсчет числа уникальных значений (всегда long);
  • первое значение (по типу поля);
  • последнее значение (по типу поля).

Для полей ET_BYTE, ET_INTR, ET_WORD, ET_NMBR, ET_LONG, среднее и сумма будут типа long. Для полей ET_DWRD - unsigned long. Для полей ET_CURR, ET_FLOA и ET_DFLT - double.

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

Результаты групповых операций не могут быть использованы в качестве операндов логических операций.