///////////////////////////////////////////////////////// Функция очистки данных SUB DataPreparation //----- Сортировка по объему продаж + накапливаемая сумма по столбцу DataTemp1: LOAD Object as Object0, Factor as Factor0 Resident Data_IN Order By Factor desc; DROP Table Data_IN; DataSet1: LOAD RowNo() as ind1, Object0 as Object1, Factor0 as Factor1 Resident DataTemp1; DROP Table DataTemp1; SumSale: LOAD Sum(Factor1) as SS Resident DataSet1 Group by 1; LET vSumFactor =FieldValue('SS', 1); DROP Table SumSale; DataSet2: LOAD ind1 as ind2, Object1 as Object2, Factor1 as Factor2, (Factor1/'$(vSumFactor)') as FactorPercentage Resident DataSet1; DataSet: LOAD ind2 as ind, Object2 as id, Factor2 as sale, FactorPercentage as SalePer, RangeSum(FactorPercentage, Peek(SalePerCum)) as SalePerCum Resident DataSet2; DROP Table DataSet1, DataSet2; ENDSUB ///////////////////////////////////////////////////////// Функция построения опорных линий SUB BaseLine //----- Выичлсяем координаты для 1-й опорной линии df_1: LOAD Min(ind) as x_begin, Max(ind) as x_end, Min(SalePerCum) as y_begin, Max(SalePerCum) as y_end Resident DataSet Group By 1; //----- Определяем коэффициенты 1-й прямой LET b_1=(FieldValue('y_end', 1)-FieldValue('y_begin', 1))/(FieldValue('x_end', 1)-FieldValue('x_begin', 1)); LET a_1=FieldValue('y_begin', 1)-'$(b_1)'*FieldValue('x_begin', 1); //----- Строим точки 1-й опорной линии temp_tbl: LOAD Max(ind) as Max_ind Resident DataSet Group By 1; LET nm=FieldValue('Max_ind', 1); DROP Table temp_tbl; line_1: LOAD RowNo() as x, '$(b_1)'*RowNo()+'$(a_1)' as y AutoGenerate '$(nm)'; Left Join LOAD ind as x, SalePerCum as diff Resident DataSet; //----- Просчитываем разницу между кумулятивной кривой и опорной линии diff_1: LOAD x as x_1, diff as diff_1, (y-diff) as y_1 Resident line_1; DROP Table line_1; //temp_tbl: //LOAD Min(y_1) as Min_Dif //Resident diff_1 //Group By 1; temp_table: LOAD x_1 as _x, y_1 as _y Resident diff_1 Order By y_1; LET x=FieldValue('_x', 1); LET y=FieldValue('_y', 1); int_point_1: LOAD * Inline [x, y '$(x)', '$(y)']; DROP Table temp_table, df_1, diff_1; LET AB_border=FieldValue('x', 1); DROP Table int_point_1; //----- Выичлсяем координаты для 2-й опорной линии df_2: LOAD Min(ind) as x_begin, Max(ind) as x_end, Min(SalePerCum) as y_begin, Max(SalePerCum) as y_end Resident DataSet Where ind >= ('$(AB_border)'+1) Group By 1; //----- Определяем коэффициенты 2-й прямой LET b_2=(FieldValue('y_end', 1)-FieldValue('y_begin', 1))/(FieldValue('x_end', 1)-FieldValue('x_begin', 1)); LET a_2=FieldValue('y_begin', 1)-'$(b_1)'*FieldValue('x_begin', 1); //----- Строим точки 2-й опорной линии temp_tbl: LOAD Max(ind) as Max_ind Resident DataSet Group By 1; LET nm=FieldValue('Max_ind', 1) - '$(AB_border)'; DROP Table temp_tbl; line_2: LOAD RowNo() + '$(AB_border)' as x, '$(b_2)'*RowNo()+'$(a_2)' as y AutoGenerate '$(nm)'; Left Join LOAD ind as x, SalePerCum as diff Resident DataSet; //----- Просчитываем разницу между кумулятивной кривой и опорной линии diff_2: LOAD x as x_2, diff as diff_2, (y-diff) as y_2 Resident line_2; DROP Table line_2; temp_table: LOAD x_2 as _x, y_2 as _y Resident diff_2 Order By y_2; LET x=FieldValue('_x', 1); LET y=FieldValue('_y', 1); int_point_2: LOAD * Inline [x, y '$(x)', '$(y)']; DROP Table temp_table, df_2, diff_2; LET BC_border=FieldValue('x', 1); DROP Table int_point_2; ENDSUB ///////////////////////////////////////////////////////// Запускающий скрипт //----- Подготовка данных дня вычисления первой опорной линии CALL DataPreparation; //----- Нахождение опорных линий CALL BaseLine; Data_OUT: LOAD *, If(ind <= '$(AB_border)', 'A', If(ind <= '$(BC_border)','B','C')) as ABC_Group Resident DataSet; DROP Table DataSet;