Tab.Group

From SunFlurry wiki
Jump to: navigation, search
  Group (Группировка)
Объект:Таблица
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Неверное имя столбца, невозможно превратить в число, строку
Визуальность:Нет

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

  1. Group: Функция уменьшает количество строк, оставляя в таблице только уникальные строки, столбцы не являющиеся столбцами группировки и столбцами агрегации удаляются из таблицы. Действие функции подобно действию функции InnerJoin, когда происходит объединение одной и той же таблицы, однако столбцы этой таблицы не удаляются. Количество строк в таблице уменьшается или остается прежним, количество столбцов в таблице уменьшается или остается прежним.
  2. InnerJoin: Функция оставляет в таблице только уникальные строки, входящие одновременно в обе таблицы. Количество строк в таблице уменьшается или остается прежним, количество столбцов в таблице остается прежним. Для столбцов, не входящих в список агрегации используется операция FIRST2.
  3. LeftOuterJoin: Функция производит операции агрегации только над строками, входящими одновременно в обе таблицы. Количество строк в таблице остается прежним, количество столбцов в таблице остается прежним.
  4. FullOuterJoin: Функция производит операции агрегации только над строками, входящими одновременно в обе таблицы и добавляет уникальные строки второй таблицы, которые отсутствовали в первой таблице. Количество строк в таблице остается прежним или увеличивается, количество столбцов в таблице остается прежним. Для столбцов, не входящих в список агрегации в добавляемых строках, используется операция FIRST2.
  5. Combine: Функция производит заданные операции (AND, ADD, XOR, SUB) над исходной таблицей с помощью второй таблицы. В отличие от функций, группы join, функция не выполняет аргегации. Добавляемые строки копируются из второй таблицы со столбцами с наименованиями, совпадающими с исходной.

Синтаксис

Tab.Group(<Наименования столбцов группировки через запятую (STRING)>,<Наименования столбцов для агрегации с типами операций (STRING)>,<Округление при суммировании (INT)>=-1)

Аргументы

  • <Наименования столбцов группировки через запятую (STRING)> - (необязательный аргумент) Аргумент перечисляет наименования столбцов через запятую, по которым будет группироваться таблица. Регистр наименований не имеет значения. Каждый заданный столбец должен присутствовать в таблице.
  • <Наименования столбцов для агрегации с типами операций (STRING)> - (необязательный аргумент) Аргумент перечисляет наименования столбцов через запятую, для которых будет выполнена заданная операция агрегации. Регистр наименований не имеет значения. Каждый заданный столбец должен присутствовать в таблице. Формат записи выглядит сл. образом: <Столбец1[:<Операция1>][,<Столбец2[:<Операция2>]...]>. Функция позволяет использовать следующие операции:
    • SUM (по умолчанию) -- значения столбца для удаляемых строк и оставшихся строк будут найдены суммированием.
    • AVG -- Будут найдены средние значения столбца для удаляемых строк и оставшихся строк.
    • MAX -- В столбцах оставшихся строках будет содержаться максимальное из значение удаляемых строк и оставшихся.
    • MIN -- В столбцах оставшихся строках будет содержаться минимальное из значение удаляемых строк и оставшихся.
    • COUNT -- В столбцах оставшихся строках будет содержаться количество удаленных строк этой группировки, увеличенное на единицу.
    • FIRST -- В столбцах оставшихся строках будет содержаться первое из встреченных значение удаляемых строк и оставшихся.
    • LAST -- В столбцах оставшихся строках будет содержаться последнее из встреченных значение удаляемых строк и оставшихся.
  • <Округление при суммировании (INT)> - (необязательный аргумент) Задает количество знаков после десятичной точки для округления значения на каждом этапе операции суммирования или нахождения среднего (по умолчанию -1, опция отключена). При нахождении суммы большого числа вещественных чисел (даже если каждое число округлено до определенного количества знаков после точки), может накопиться неточность (см. Числа). Обычно такие неточности невелики и не имеют никакого значения при расчетах. Однако, для случаев, когда необходима высокая точность при вычислениях чисел с известным количеством знаков после точки, можно использовать эту опцию, которая позволяет автоматически производить округление полученного значения после каждой операции, тем самым исключив накопление неточности. Пример см. ниже.

Примеры

//Создается и заполняется таблица значений
aTab:=Tab.Create("b1,b2,b3,b4");

aTab.AddLine("b1,b2,b3,b4",2,2,3,4);
aTab.AddLine("b1,b2,b3,b4",2,2,3,33);
aTab.AddLine("b1,b2,b3,b4",3,5,3,4);
aTab.AddLine("b1,b2,b3,b4",4,2,3,4);
aTab.AddLine("b1,b2,b3,b4",4,2,5,77);
aTab.AddLine("b1,b2,b3,b4",5,2,3,4);

//Таблица группируется по значениям столбцов b1 и b2, т.е., в результирующей таблице будут присутствовать только строки с уникальным сочетанием значений столбцов b1 и b2,
// при этом в столбце b4 будет найдена сумма столбца оставленной строки и значений столбцов удаленных строк-дублей,
// а в столбце b3 будет найдено максимальное значение столбца оставленной строки и значений столбцов удаленных строк-дублей.
aTab.Group("b1,b2","b4,b3:MAX");

aTab.Select();
While aTab.Next() Do
  Message(""+aTab.b1+"; "+aTab.b2+"; "+aTab.b3+"; "+aTab.b4);
EndDo;

//Будет выведено последовательно:
//"2; 2; 3; 37"    -- данная строка была собрана из строк 1 и 2 оригинальной таблицы
//"3; 5; 3; 4"     -- данная строка является точной копией строки 3 оригинальной таблицы
//"4; 2; 5; 81"    -- данная строка была собрана из строк 4 и 5 оригинальной таблицы, значение 5 взято из строки 5, как максимальное из двух
//"5; 2; 3; 4"     -- данная строка является точной копией строки 6 оригинальной таблицы

Пример, показывающий работу опции по исключению накопления неточности

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

aTab:=Tab.Create("b1");
For i:=1 To 1000000 Do
  aTab.AddLine("b1",1.33552);
EndDo;

Message(NumberToStr(aTab.Sum("b1"),1));
Message(NumberToStr(aTab.Sum("b1",0,1,aTab.Size(),5),1));
//В первом случае будет выведено: "1335519.99999998508"
//Во втором случае будет выведено: "1335520"
//Сложение миллиона чисел (подобранных с целью увеличения неточности) дает неточность большую, чем 1E-8, при этом, сами числа имеют точность 1E-5, 
//  эти значения уже сравнимы между собой, поэтому при очень большом количестве операций над числами с длинными но точными мантиссами можно получить ошибку в последних знаках результата.
//Для вещественных чисел с мантиссами любой точности это не имеет большого значения, так как такие числа в основном используются для нахождения статистических, 
//  средних значений или при рисовании графиков, где точность результата ограничивается условием и обычно не превышает нескольких знаков после точки.
//По времени выполнения: функция сложения без округления была выполнена (i5) за 9.8 мс., с округлением 23.1 мс., т.е. разница по времени выполнения чуть больше 2 раз, 
//  что не очень много, учитывая высокую скорость работы таких функций.