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

Lặp lại các bản ghi PostgreSQL. Làm thế nào để tham chiếu dữ liệu từ hàng tiếp theo?

Nói chung, bạn cần nghiên cứu những điều cơ bản , trước khi bạn bắt đầu đặt câu hỏi.
Đọc hướng dẫn tuyệt vời về CREATE FUNCTION , PL / pgSQL Hàm SQL .

Những điểm chính khiến ví dụ này vô nghĩa

  • Trước tiên, bạn không thể cung cấp số nhận dạng như bạn làm. Số nhận dạng không thể được tham số hóa trong SQL thuần túy. Bạn cần SQL động cho điều đó.
    Tất nhiên, bạn thực sự không cần điều đó, theo yêu cầu của bạn. Chỉ có một bảng tham gia. Thật là vô nghĩa nếu thử và tham số hóa nó.

  • Không sử dụng tên loại làm định danh. Tôi sử dụng _date thay vì date làm tên thông số và đổi tên cột trong bảng của bạn thành asset_date . ALTER định nghĩa bảng của bạn cho phù hợp.

  • Một hàm tìm nạp dữ liệu từ bảng không bao giờ được IMMUTABLE . Đọc hướng dẫn.

  • Bạn đang trộn cú pháp SQL với các phần tử plpgsql theo những cách vô nghĩa. WITH là một phần của SELECT và không thể trộn lẫn với các cấu trúc điều khiển plpgsql như LOOP hoặc IF .

Chức năng phù hợp

Một hàm thích hợp có thể trông như thế này (một trong nhiều cách):

CREATE FUNCTION percentage_change_func(_asset_symbol text)
  RETURNS TABLE(asset_date date, price numeric, pct_change numeric) AS
$func$
DECLARE
   last_price numeric;
BEGIN

FOR asset_date, price IN
   SELECT a.asset_date, a.price
   FROM   asset_histories a
   WHERE  a.asset_symbol = _asset_symbol 
   ORDER  BY a.asset_date  -- traverse ascending
LOOP
   pct_change := price / last_price; -- NULL if last_price is NULL
   RETURN NEXT;
   last_price := price;
END LOOP;

END
$func$ LANGUAGE plpgsql STABLE

Hiệu suất không quá tệ, nhưng nó chỉ là một sự phức tạp vô nghĩa.

Giải pháp thích hợp:truy vấn đơn giản

Cách đơn giản nhất (và có thể là nhanh nhất) là với hàm window lag() :

SELECT asset_date, price
      ,price / lag(price) OVER (ORDER BY asset_date) AS pct_change
FROM   asset_histories
WHERE  asset_symbol = _asset_symbol 
ORDER  BY asset_date;

Độ lệch chuẩn

Theo nhận xét sau này, bạn muốn tính toán các con số thống kê như độ lệch chuẩn.
phân tách các hàm cho thống kê trong PostgreSQL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sự khác biệt của Rails / Postgresql SQL w / Ngày

  2. psql - lưu kết quả của lệnh vào một tệp

  3. PostgreSQL:Tạo chỉ mục cho cột boolean

  4. Sqoop trên Dataproc không thể xuất dữ liệu sang định dạng Avro

  5. Cant pg_restore trên Heroku:không thể đọc từ tệp đầu vào:cuối tệp