Postgresql

如何用非零值的前一行數據填充目前行中的數據?

  • July 26, 2022

假設我有下表:

CREATE TEMPORARY TABLE stocks (
   my_date date,
   my_shares int,
   stock_price decimal,
   new_shares int
);

INSERT INTO stocks VALUES('2021-01-01', 100, 10.50, 100);
INSERT INTO stocks VALUES('2021-01-02', 100, 11.00, 0);
INSERT INTO stocks VALUES('2021-01-03', 100, 11.25, 0);
INSERT INTO stocks VALUES('2021-01-04', 150, 12.00, 50);
INSERT INTO stocks VALUES('2021-01-05', 175, 13.00, 25);

select * from stocks

股票1

在上表中,my_shares是我擁有的股票總數,是new_shares我將購買的股票數量my_date

我想創建另一個名為的列my_cost,顯示我最近購買的股票的總成本(不是總成本)。my_cost= stock_price*new_sharesnew_shares> 0。

決賽桌應如下所示:

股票2

請注意,即使我沒有在 1/2 和 1/3 購買新股票,我最近購買的成本仍然顯示。

我無法弄清楚如何做到這一點。我主要嘗試CASE了不同的變體,rows between unbounded preceding and preceding 1 row但我只是在猜測。任何人都可以幫忙嗎?

PostgreSQL 13

WITH cte AS (
   SELECT *, SUM(new_shares>0) OVER (PARTITION BY my_shares ORDER BY my_date) grp
   FROM stocks
)
SELECT *, FIRST_VALUE(stock_price * new_shares) OVER (PARTITION BY my_shares, grp ORDER BY my_date) my_cost
FROM cte

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=5af6e1eb3f6e747e47eb8763c2b79f63

修復目前數據後,刪除該程式碼。然後修改您的程式碼,以便將來INSERTs抓住前一行,以防今天有新購買。也就是說,避免GIGO要便宜得多。

引用自:https://dba.stackexchange.com/questions/314831