我在PostgreSQL中获得了一个临时视图,它提供了以下数据(简化):
temporary_view (sum, rw):
|sum | rw|
|1337 | 1|
|42 | 2|
|... | ...|
现在我需要对此进行递归,直到达到我的状态。
为简单起见,假设我想计算一下sum > 2000
需要多少行。
在我的实际实现中,我需要使用更复杂的公式。
如果达到sum > 2000
,递归应该停止并返回用于计算的最后一个row_number。
您将如何在SQL中实现此功能?我尝试过很多东西但不幸的是我每次都失败了。
我的想法:我会使用(sum, row, last_row)
的临时视图,我每次都会减去last_row,但不幸的是我正在努力实施......
答案 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;
答案 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;