带有row_numbers的SQL递归

时间:2014-11-28 22:32:12

标签: sql postgresql recursion window-functions row-number

我在PostgreSQL中获得了一个临时视图,它提供了以下数据(简化):

temporary_view (sum, rw):

|sum   |  rw|
|1337  |   1|
|42    |   2|
|...   | ...|

现在我需要对此进行递归,直到达到我的状态。

为简单起见,假设我想计算一下sum > 2000需要多少行。 在我的实际实现中,我需要使用更复杂的公式。

如果达到sum > 2000,递归应该停止并返回用于计算的最后一个row_number。

您将如何在SQL中实现此功能?我尝试过很多东西但不幸的是我每次都失败了。

我的想法:我会使用(sum, row, last_row)的临时视图,我每次都会减去last_row,但不幸的是我正在努力实施......

2 个答案:

答案 0 :(得分:2)

select min(rw)
from
(
    select rw, sum(sm) over(order by rw) sm_cum
    from temporary_view
)
where sm_cum > 2000;

使用分析函数计算累积总和,然后获得最小值。你甚至不需要在这里递归。

sum的递归变量(您可以在表达式上更改它):

with recursive tmp (rw, complicated) as (
    select rw, sm
    from temporary_view where rw = 1 and sm <= 1000
    union 
    select t.rw, tmp.complicated + t.sm
    from temporary_view t join tmp on t.rw = tmp.rw + 1
    where tmp.complicated <= 1000
)
select max(rw) from tmp;

http://sqlfiddle.com/#!12/11583/3

答案 1 :(得分:1)

对于原始问题:获取整行,而不仅仅是rw

的值
SELECT *
FROM  (
   SELECT *, sum(sm) OVER(ORDER BY rw) sum_sm
   FROM   temporary_view
)
WHERE  sum_sm > 2000  -- you may really want >=
ORDER  BY sum_sm
LIMIT  1;