Tab.FullOuterJoin
FullOuterJoin, FullJoin (Объединение таблиц) | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Функция выполняет агрегацию строк текущей таблицы с эквивалентными строками указанной таблицы (эквивалентной считается строка, для которой значения всех столбцов группировки в обеих таблицах будет одинаковым), строки указанной таблицы, для которых нет эквивалента в текущей таблице, будут добавлены в последнюю с конца таблицы. При этом ячейки в столбцах агрегации будут представлять результат операции агрегации над строками исходной таблицы и всеми эквивалентными строками указанной таблицы. Для исключения накопления неточности при сложении вещественных чисел, можно указать требуемое количество цифр после точки при выполнении операций агрегации. После выполнения операции, в таблице сохраняется порядок следования строк, существовавший до операции. Столбцы группировки не должны включать столбцы агрегации и наоборот. Если исходная таблица содержит дублирующиеся строки (с одинаковыми значениями в столбцах группировки), такие строки будут пропущены при операции, операция агрегации значений столбцов агрегации будет выполнена только для первой из таких строк дублей и будет произведена со всеми эквивалентными строками второй таблицы. Объединение таблицы с самой таблицей не запрещается, но имеет мало смысла.
Разница между функциями объединения таблиц:
- Group: Функция уменьшает количество строк, оставляя в таблице только уникальные строки, столбцы не являющиеся столбцами группировки и столбцами агрегации удаляются из таблицы. Действие функции подобно действию функции InnerJoin, когда происходит объединение одной и той же таблицы, однако столбцы этой таблицы не удаляются. Количество строк в таблице уменьшается или остается прежним, количество столбцов в таблице уменьшается или остается прежним.
- InnerJoin: Функция оставляет в таблице только уникальные строки, входящие одновременно в обе таблицы. Количество строк в таблице уменьшается или остается прежним, количество столбцов в таблице остается прежним. Для столбцов, не входящих в список агрегации используется операция FIRST2.
- LeftOuterJoin: Функция производит операции агрегации только над строками, входящими одновременно в обе таблицы. Количество строк в таблице остается прежним, количество столбцов в таблице остается прежним.
- FullOuterJoin: Функция производит операции агрегации только над строками, входящими одновременно в обе таблицы и добавляет уникальные строки второй таблицы, которые отсутствовали в первой таблице. Количество строк в таблице остается прежним или увеличивается, количество столбцов в таблице остается прежним. Для столбцов, не входящих в список агрегации в добавляемых строках, используется операция FIRST2.
- Combine: Функция производит заданные операции (AND, ADD, XOR, SUB) над исходной таблицей с помощью второй таблицы. В отличие от функций, группы join, функция не выполняет аргегации. Добавляемые строки копируются из второй таблицы со столбцами с наименованиями, совпадающими с исходной.
Синтаксис
Tab.FullOuterJoin(<Таблица, с которой объединяется текущая (TAB)>,<Наименования столбцов группировки через запятую (STRING)>,<Наименования столбцов для агрегации с типами операций (STRING)>,<Округление при суммировании (INT)>=-1)
Аргументы
<Таблица, с которой объединяется текущая (TAB)>
- Объект типа таблица, которая будет использована для объединения, но не будет подвержена изменениям.<Наименования столбцов группировки через запятую (STRING)>
- (необязательный аргумент) Аргумент перечисляет наименования столбцов через запятую, по которым будет группироваться таблица. Регистр наименований не имеет значения. Каждый заданный столбец должен присутствовать в обеих таблицах.<Наименования столбцов для агрегации с типами операций (STRING)>
- (необязательный аргумент) Аргумент перечисляет наименования столбцов через запятую, для которых будет выполнена заданная операция агрегации при нахождении эквивалентной строки во второй таблице. Регистр наименований не имеет значения. Каждый заданный столбец должен присутствовать в обеих таблицах. Формат записи выглядит сл. образом:<Столбец1[:<Операция1>][,<Столбец2[:<Операция2>]...]>
. Функция позволяет использовать следующие операции:- SUM2 (по умолчанию) -- Значение столбца будет найдено путем суммирования значения столбца исходной таблицы со значениями столбцов эквивалентных строк второй таблицы.
- AVG2 -- Значение столбца будет найдено, как среднее между значением столбца исходной таблицы и значениями столбцов эквивалентных строк второй таблицы.
- MAX2 -- Значение столбца будет найдено, как максимальное между значением столбца исходной таблицы и значениями столбцов эквивалентных строк второй таблицы.
- MIN2 -- Значение столбца будет найдено, как минимальное между значением столбца исходной таблицы и значениями столбцов эквивалентных строк второй таблицы.
- COUNT2 -- Значение столбца будет найдено, как количество эквивалентных строк второй таблицы, увеличенное на единицу.
- FIRST2 -- Значение столбца изменено не будет (тоже самое, что отсутствие столбца в столбцах агрегации).
- LAST2 -- Значение столбца будет найдено, как последнее из значений столбцов эквивалентных строк второй таблицы, если ни одна эквивалентная строка не найдена, исходное значение столбца не будет изменено.
- SUM -- Значение столбца будет найдено путем суммирования значений столбцов эквивалентных строк второй таблицы. Исходное значение столбца в сумму не входит. Однако, если эквивалентная строка не найдена, исходное значение столбца не будет изменено!
- AVG -- Значение столбца будет найдено, как среднее между значениями столбцов эквивалентных строк второй таблицы. Исходное значение столбца в вычисления не входит. Однако, если эквивалентная строка не найдена, исходное значение столбца не будет изменено!
- MAX -- Значение столбца будет найдено, как максимальное между значениями столбцов эквивалентных строк второй таблицы. Исходное значение столбца в вычисления не входит. Однако, если эквивалентная строка не найдена, исходное значение столбца не будет изменено!
- MIN -- Значение столбца будет найдено, как минимальное между значениями столбцов эквивалентных строк второй таблицы. Исходное значение столбца в вычисления не входит. Однако, если эквивалентная строка не найдена, исходное значение столбца не будет изменено!
- COUNT -- Значение столбца будет найдено, как количество эквивалентных строк второй таблицы. Однако, если эквивалентная строка не найдена, исходное значение столбца не будет изменено!
- FIRST -- Значение столбца будет найдено, как первое из значений столбцов эквивалентных строк второй таблицы, если ни одна эквивалентная строка не найдена, исходное значение столбца не будет изменено.
- LAST -- Соответствует операции LAST2.
<Округление при суммировании (INT)>
- (необязательный аргумент) Задает количество знаков после десятичной точки для округления значения на каждом этапе операции суммирования или нахождения среднего (по умолчанию -1, опция отключена). При нахождении суммы большого числа вещественных чисел (даже если каждое число округлено до определенного количества знаков после точки), может накопиться неточность (см. Числа). Обычно такие неточности невелики и не имеют никакого значения при расчетах. Однако, для случаев, когда необходима высокая точность при вычислениях чисел с известным количеством знаков после точки, можно использовать эту опцию, которая позволяет автоматически производить округление полученного значения после каждой операции, тем самым исключив накопление неточности. Пример см. ниже.
Примеры
//Создаются и заполняется две таблицы значений aTab:=Tab.Create("b1,b2,b3,b4"); bTab:=Tab.Create("b1,b2,b3,b4"); aTab.AddLine("b1,b2,b3,b4",1,2,3,4); aTab.AddLine("b1,b2,b3,b4",2,2,3,4); aTab.AddLine("b1,b2,b3,b4",3,5,5,4); aTab.AddLine("b1,b2,b3,b4",4,2,3,4); aTab.AddLine("b1,b2,b3,b4",4,2,3,4); aTab.AddLine("b1,b2,b3,b4",5,2,3,4); bTab.AddLine("b1,b2,b3,b4",5,2,3,4); bTab.AddLine("b1,b2,b3,b4",3,2,3,4); bTab.AddLine("b1,b2,b3,b4",4,2,5,4); bTab.AddLine("b1,b2,b3,b4",4,2,3,4); bTab.AddLine("b1,b2,b3,b4",5,5,3,4); bTab.AddLine("b1,b2,b3,b4",1,2,3,4); bTab.AddLine("b1,b2,b3,b4",3,2,5,5); aTab.FullJoin(bTab,"b1,b2","b3:SUM2,b4:SUM"); aTab.Select(); While aTab.Next() Do Message(""+aTab.b1+"; "+aTab.b2+"; "+aTab.b3+"; "+aTab.b4); EndDo; //Будет выведено последовательно: //"1; 2; 6; 4" -- данная строка является эквивалентной строке 6 второй таблицы, значение b4 берется из нее, так как оно не может добавляться к значению оригинальной таблицы //"2; 2; 3; 4" -- данная строка не имеет эквивалентных строк //"3; 5; 5; 4" -- данная строка не имеет эквивалентных строк //"4; 2; 11; 8" -- данная строка является эквивалентной строкам 3 и 4 второй таблицы, значение b3 является суммой трех значений, b4 -- двух. //"4; 2; 3; 4" -- данная строка будет пропущена, так как она является дублем предыдущей строки //"5; 2; 6; 4" -- данная строка является эквивалентной строке 1 второй таблицы, значение b4 берется из нее, так как оно не может добавляться к значению оригинальной таблицы //"3; 2; 8; 9" -- данная строка добавлена в таблицу, как строка 2 второй таблицы, так как не нашлось ее эквивалента, после чего она стала эквивалентной строке 7 второй таблицы //"5; 5; 3; 4" -- данная строка добавлена в таблицу, как строка 5 второй таблицы, так как не нашлось ее эквивалента
Пример, показывающий работу опции по исключению накопления неточности
Данный пример показывает, как можно избежать накопления неточности при суммировании большого количества вещественных чисел, если известна точность их представления (количество знаков в мантиссе).
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 раз, // что не очень много, учитывая высокую скорость работы таких функций.