postgreSQL,累计和达到标记的第一个日期

postgreSQL, first date when cummulative sum reaches mark

我有以下样本table 并且输出应该是 cum_rev 达到 100 标记时的第一个日期(对于每个 id)。

我尝试了以下方法,因为我教过 group bz 技巧和 where 条件,我只会得到第一次出现的大于 100 的值。

SELECT id
    ,pd
    ,cum_rev
FROM (
    SELECT id
        ,pd
        ,rev
        ,SUM(rev) OVER (
            PARTITION BY id 
            ORDER BY pd
            ) AS cum_rev
    FROM tab1
    )
WHERE cum_rev >= 100
GROUP BY id

但是它不起作用,我收到以下错误。而且当我添加别名时也没有帮助

ERROR: subquery in FROM must have an alias LINE 4: FROM ( ^ HINT: For example, FROM (SELECT ...) [AS] foo.

所以期望的输出是:

2   2015-04-02  135.70
3   2015-07-03  102.36

我需要另一种方法吗?谁能帮忙? 谢谢

demo:db<>fiddle

SELECT
    id, total
FROM (
    SELECT
        *,
        SUM(rev) OVER (PARTITION BY id ORDER BY pd) - rev as prev_total,
        SUM(rev) OVER (PARTITION BY id ORDER BY pd) as total
    FROM tab1
) s
WHERE total >= 100 AND prev_total < 100

可以对每个id组(分区)使用累计SUM() window function。要找到第一个超过阈值的值,您需要检查前一个值是否低于阈值,而当前值是否符合阈值。

PS: 您收到错误是因为您的子查询缺少别名。在我的示例中,它只是 s