PostgreSQL - 如何获得先前(滞后)计算的值

时间:2016-11-24 18:36:44

标签: postgresql window-functions

我想获得之前的(滞后)计算值?

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;不存在

2 个答案:

答案 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;

<强> OUTPUT

答案 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

在线示例:http://rextester.com/WFBVM53545