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
我需要另一种方法吗?谁能帮忙?
谢谢
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
我有以下样本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
我需要另一种方法吗?谁能帮忙? 谢谢
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