PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tổng hợp các hàm trên các mảng

Hãy thử một cái gì đó như sau:

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

SELECT này sẽ cung cấp cho bạn 300 bản ghi cho mỗi array300 có cùng id và gán cho họ bucket_num (1 cho 3 phần tử đầu tiên, 2 cho 3 phần tử tiếp theo, v.v.).

Sau đó, sử dụng lựa chọn này để lấy avg của các phần tử trong nhóm:

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

Tiếp theo - chỉ cần tổng hợp avg_val thành mảng:

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

Chi tiết: không trung thực , ntile , array_agg , HẾT (PHẦN BẰNG)

UPD:Hãy thử chức năng này:

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;

Nó cần một array300 và xuất ra một array100 . Để sử dụng nó:

SELECT id, array300_to_100(array300)
FROM table1;

Nếu bạn có bất kỳ vấn đề gì khi hiểu nó - hãy hỏi tôi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lập chỉ mục các khóa nước ngoài trong Postgresql

  2. Cách liệt kê các chỉ mục được tạo cho bảng trong postgres

  3. Làm thế nào để cấu hình pgAdmin III để mở cơ sở dữ liệu mặc định và chọn nút bảng khi khởi động?

  4. Bảo mật cấp hàng không hoạt động đối với chủ sở hữu bảng

  5. Chặn các kết nối không hoạt động trên ClientRead đối với các truy vấn được tham số hóa (ràng buộc) khi có lưu lượng truy cập cao