#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 …