Postgresql
如何用非零值的前一行數據填充目前行中的數據?
假設我有下表:
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
在上表中,
my_shares
是我擁有的股票總數,是new_shares
我將購買的股票數量my_date
。我想創建另一個名為的列
my_cost
,顯示我最近購買的股票的總成本(不是總成本)。my_cost
=stock_price
*new_shares
當new_shares
> 0。決賽桌應如下所示:
請注意,即使我沒有在 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要便宜得多。