Разделите каждый элемент массива на каждый элемент одного и того же массива POSTGRESQL

#arrays #database #postgresql #loops #dynamic-arrays

Вопрос:

Я пытаюсь создать функцию в POSTGRESQL, которая позволяет мне возвращать разделение каждого элемента массива среди всех элементов одного и того же массива и которая возвращает массив с результатом разделения в качестве вывода.

Например, у меня есть массив платежей по столбцам

 select array['205','200','2000'] as payments  
платежи
{{205,200,2000}

Этот массив содержит три элемента, которые могут быть повторены, функция должна выполнить эти операции:

массив [a/b -1 , a/c -1 , b/a — 1 , b/c -1 , c/a -1 , c/b -1]

a= 205, b= 200, c= 2000

Выходные данные должны быть в формате массива, аналогичном этому:

 select array[  abs(round(205::numeric/200::numeric-1,3))*100  ,abs(round(205::numeric/2000::numeric-1,3))*100    ,abs(round(200::numeric/205::numeric-1,3))*100  ,abs(round(200::numeric/2000::numeric-1,3))*100   ,abs(round(2000::numeric/205::numeric-1,3))*100  ,abs(round(2000::numeric/200::numeric-1,3))*100  ]  
платежные операции
{2.500,89.800,2.400,90.000,875.600,900.000}

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

У меня есть эта функция, которую я адаптирую, но у меня нет желаемого результата:

 WITH   RECURSIVE t   AS (  SELECT i::numeric, row_number() OVER () AS rn  FROM unnest('{205,200,2000}'::text[]) i   )  ,   cte AS (  SELECT i AS combo, rn, 1 AS ct  FROM t   UNION ALL  SELECT (cte.combo / t.i -1)* 100, t.rn, ct   1  FROM cte  JOIN t ON t.rn gt; cte.rn  ) SELECT ARRAY ( SELECT abs(round(combo,3)) FROM cte ORDER BY ct, combo ) AS result;  

Выход:

Результаты
{200.000,205.000,2000.000,90.000,89.750,2.500,99.875}

Finally, if you want to go through each element of the final array, and if it is greater than 5 in absolute value, set the flag: ‘Approved’

How could i do it?

I am attentive to your comments.

Thanks …