我想获得之前的(滞后)计算值?
CustomerCollection = Customer.getDataSource().connector.collection("Customer");
我想要实现的目标是:
id | value
-------|-------
1 | 1
2 | 3
3 | 5
4 | 7
5 | 9
我尝试过:
id | value | new value
-------|-------|-----------
1 | 1 | 10 <-- 1 * lag(new_value)
2 | 3 | 30 <-- 3 * lag(new_value)
3 | 5 | 150 <-- 5 * lag(new_value)
4 | 7 | 1050 <-- 7 * lag(new_value)
5 | 9 | 9450 <-- 9 * lag(new_value)
错误:
错误:列&#34; new_value&#34;不存在
答案 0 :(得分:1)
我的不好,这并不像我想的那么容易。得到了非常接近的结果,但仍然需要一些调整。
<强> DEMO 强>
WITH RECURSIVE t(n, v) AS (
SELECT MIN(value), 10
FROM Table1
UNION ALL
SELECT (SELECT min(value) from Table1 WHERE value > n),
(SELECT min(value) from Table1 WHERE value > n) * v
FROM t
JOIN Table1 on t.n = Table1.value
)
SELECT n, v
FROM t;
答案 1 :(得分:1)
与Juan的答案相似但我认为无论如何我都会发布它。它至少避免了对ID列的需要,并且最后没有空行:
with recursive all_data as (
select value, value * 10 as new_value
from data
where value = 1
union all
select c.value,
c.value * p.new_value
from data c
join all_data p on p.value < c.value
where c.value = (select min(d.value)
from data d
where d.value > p.value)
)
select *
from all_data
order by value;
这个想法是将递归部分中的一行恰好连接到一个“父”行。虽然“完全一个父”可以使用派生表和横向连接完成(令人惊讶的是 允许limit
)。遗憾的是,只有使用min()
的子选择才能完成递归部分中“子”的“恰好一行”。
如果可以在递归部分中使用where c.value= (...)
和order by
,则不需要limit
,但遗憾的是,当前的Postgres版本不支持update #temp
set f_id = isnull(f_id, 0) +
case when condition1 is met then value 1
etc
when final condition is met then 0
else null
end