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

Làm thế nào để tính toán đường trung bình động theo cấp số nhân trên postgres?

Bạn có thể xác định hàm tổng hợp của riêng mình và sau đó sử dụng nó với đặc tả cửa sổ để nhận kết quả tổng hợp ở mỗi giai đoạn thay vì một giá trị duy nhất.

Vì vậy, tổng hợp là một phần của trạng thái và một hàm chuyển đổi để sửa đổi trạng thái đó cho mỗi hàng và tùy chọn là một hàm tổng hợp để chuyển đổi trạng thái thành giá trị đầu ra. Đối với trường hợp đơn giản như thế này, chỉ cần một hàm biến đổi là đủ.

create function ema_func(numeric, numeric) returns numeric
  language plpgsql as $$
declare
  alpha numeric := 0.5;
begin
  -- uncomment the following line to see what the parameters mean
  -- raise info 'ema_func: % %', $1, $2;
  return case
              when $1 is null then $2
              else alpha * $2 + (1 - alpha) * $1
         end;
end
$$;
create aggregate ema(basetype = numeric, sfunc = ema_func, stype = numeric);

mang lại cho tôi:

[email protected]@[local] =# select x, ema(x, 0.1) over(w), ema(x, 0.2) over(w) from data window w as (order by n asc) limit 5;
     x     |      ema      |      ema      
-----------+---------------+---------------
 44.988564 |     44.988564 |     44.988564
   39.5634 |    44.4460476 |    43.9035312
 38.605724 |   43.86201524 |   42.84396976
 38.209646 |  43.296778316 |  41.917105008
 44.541264 | 43.4212268844 | 42.4419368064

Những con số này dường như khớp với bảng tính bạn đã thêm vào câu hỏi.

Ngoài ra, bạn có thể xác định hàm để chuyển alpha dưới dạng tham số từ câu lệnh:

create or replace function ema_func(state numeric, inval numeric, alpha numeric)
  returns numeric
  language plpgsql as $$
begin
  return case
         when state is null then inval
         else alpha * inval + (1-alpha) * state
         end;
end
$$;

create aggregate ema(numeric, numeric) (sfunc = ema_func, stype = numeric);

select x, ema(x, 0.5 /* alpha */) over (order by n asc) from data

Ngoài ra, hàm này thực sự đơn giản đến mức nó không cần phải ở trong plpgsql, mà có thể chỉ là một hàm sql, mặc dù bạn không thể tham chiếu đến các tham số theo tên của một trong số đó:

create or replace function ema_func(state numeric, inval numeric, alpha numeric)
  returns numeric
  language sql as $$
select case
       when $1 is null then $2
       else $3 * $2 + (1-$3) * $1
       end
$$;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. chuỗi byte không hợp lệ để mã hóa UTF8

  2. Nhà cung cấp dịch vụ đám mây chuyên sâu:PostgreSQL trên DigitalOcean

  3. Cách cbrt () hoạt động trong PostgreSQL

  4. SQL Nhận tất cả các bản ghi cũ hơn 30 ngày

  5. Chuyển từ MySQL sang PostgreSQL - mẹo, thủ thuật và mẹo gì?