PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Агрегирани функции над масиви

Опитайте нещо подобно:

SELECT id, unnest(array300) as val, ntile(100) OVER (PARTITION BY id) as bucket_num
FROM your_table

Това SELECT ще ви даде 300 записа на array300 със същия id и им присвояване на bucket_num (1 за първите 3 елемента, 2 за следващите 3 и т.н.).

След това използвайте този избор, за да получите avg от елементи в кофата:

SELECT id, avg(val) as avg_val
FROM (...previous select here...)
GROUP BY id, bucket_num

След това просто агрегирайте avg_val в масив:

SELECT id, array_agg(avg_val) as array100
FROM (...previous select here...)
GROUP BY id

Подробности:unnest , ntile , array_agg , НАД (ДЕЛЕНИЕ ПО)

UPD:Опитайте тази функция:

CREATE OR REPLACE FUNCTION public.array300_to_100 (
  p_array300 numeric []
)
RETURNS numeric [] AS
$body$
DECLARE
  dim_start int = array_length(p_array300, 1); --size of input array
  dim_end int = 100; -- size of output array
  dim_step int = dim_start / dim_end; --avg batch size
  tmp_sum NUMERIC; --sum of the batch
  result_array NUMERIC[100]; -- resulting array
BEGIN

  FOR i IN 1..dim_end LOOP --from 1 to 100.
    tmp_sum = 0;

    FOR j IN (1+(i-1)*dim_step)..i*dim_step LOOP --from 1 to 3, 4 to 6, ...
      tmp_sum = tmp_sum + p_array300[j];  
    END LOOP; 

    result_array[i] = tmp_sum / dim_step;
  END LOOP; 

  RETURN result_array;
END;
$body$
LANGUAGE 'plpgsql'
IMMUTABLE
RETURNS NULL ON NULL INPUT;

Необходим е един array300 и извежда един array100 . За да го използвате:

SELECT id, array300_to_100(array300)
FROM table1;

Ако имате проблеми с разбирането - просто ме попитайте.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как Acosd() работи в PostgreSQL

  2. Каква е цената на ограниченията CHECK в Postgres 9.x?

  3. Мога ли да променя метода на разпространение на съществуваща таблица на Citus?

  4. Основно наблюдение на PostgreSQL – част 1

  5. Perl + PostgreSQL-- Транспониране на селективна колона към ред