行之间的Postgresql差异
Postgresql difference between rows
我的数据:
id value
1 10
1 20
1 60
2 10
3 10
3 30
如何计算第 'change' 列?
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 行是最后一行,则计算 100 值,
否则计算 next_value-value_now
您可以使用 window function 访问 "next"(或 "previous")行的值。 "next" 行的概念只有在您有一个列来定义行的顺序时才有意义。您说您有一个日期列,您可以在其中订购结果。为此,我使用了列名 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
我的数据:
id value
1 10
1 20
1 60
2 10
3 10
3 30
如何计算第 'change' 列?
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 行是最后一行,则计算 100 值, 否则计算 next_value-value_now
您可以使用 window function 访问 "next"(或 "previous")行的值。 "next" 行的概念只有在您有一个列来定义行的顺序时才有意义。您说您有一个日期列,您可以在其中订购结果。为此,我使用了列名 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