簡體   English   中英

Postgresql行之間的區別

[英]Postgresql difference between rows

我的數據:

id value
1     10
1     20
1     60
2     10
3     10
3     30

如何計算列'更改'?

id value  change  |    my comment, how to compute
1     10     10   |    20-10
1     20     40   |    60-20
1     60     40   |    default_value-60. In this example default_value=100 
2     10     90   |    default_value-10
3     10     20   |    30-10
3     30     70   |    default_value-30

換句話說:如果id行是last,則計算100值,否則計算next_value-value_now

您可以使用窗口函數訪問“下一個”(或“上一個”)行的 如果您有一列用於在行上定義訂單,則“下一行”的概念才有意義。 您說您有一個日期列,您可以在其上訂購結果。 為此我使用了列名your_date_column 當然,您需要將其替換為實際的列名。

select id, 
       value, 
       lead(value, 1, 100) over (partition by id order by your_date_column) - value as change
from the_table
order by id, your_date_column

lead(value, 1, 100)表示:取“next”行的列value (即1 )。 如果沒有這樣的行,請使用默認值100

加入子查詢並使用ROW_NUMBER查找每個組的最后一個值

WITH CTE AS(
SELECT id,value,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY date) rn,
(LEAD(value) OVER (PARTITION BY id ORDER BY date)-value) change FROM t)
SELECT cte.id,cte.value,
(CASE WHEN cte.change IS NULL THEN 100-cte.value ELSE cte.change END)as change FROM cte LEFT JOIN
(SELECT id,MAX(rn) mrn FROM cte
GROUP BY id) as x
ON x.mrn=cte.rn AND cte.id=x.id

小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM