SQL:每天使用 window 函数应用聚合结果

SQL: Apply an aggregate result per day using window functions

考虑一个时间序列 table,它包含三个字段 time,类型为 timestamptzbalance 类型为 numeric,和 is_spent_column 类型 text

以下查询为给定时间间隔的最后一天生成有效结果。

SELECT
    MAX(DATE_TRUNC('DAY', (time))) as last_day,
    SUM(balance)  FILTER ( WHERE is_spent_column is NULL ) AS value_at_last_day
FROM tbl

2010-07-12 18681.800775017498741407984000

但是,我需要一个基于 window 函数的等效查询,以报告截至并包括给定日期的所有日期的名为 balance 的列的总值。

这是我迄今为止尝试过的方法,但没有任何有效结果:

SELECT
    DATE_TRUNC('DAY', (time)) AS daily,
    SUM(sum(balance) FILTER ( WHERE is_spent_column is NULL ) ) OVER ( ORDER BY DATE_TRUNC('DAY', (time)) ) AS total_value_per_day
FROM tbl
group by 1
order by 1 desc

2010-07-12 16050.496339044977568391974000

2010-07-11 13103.159119670350269890284000

2010-07-10 12594.525752964512456914454000

2010-07-09 12380.159588711091681327014000

2010-07-08 12178.119542536668113577014000

2010-07-07 11995.943973804127033140014000


编辑:

这是一个示例数据集: LINK 删除

运行 总数可以通过对整个数据集应用上面的第一个查询来计算,直到并包括所需的日期。例如,对于第 2009-01-31 天,结果是 97.13522530000000000000,或者对于第 2009-01-15 天,当我们将时间过滤为 time < '2009-01-16 00:00:00' 时,结果是 returns 24.446144000000000000.

我需要的是一个替代查询,它可以在单个查询中计算每天的 运行 总数。

编辑 2:

非常感谢大家的参与和支持。

查询结果集不同的原因是在前面的ETL管道上。对不起我的无知!

下面我提供了一个示例架构来测试查询。

https://www.db-fiddle.com/f/veUiRauLs23s3WUfXQu3WE/2

现在上面给出的查询和下面答案中给出的查询return结果相同。

考虑通过 window 函数 将数据聚合到天级别后计算 运行 总数。并且由于您使用单个条件进行聚合,因此 FILTER 条件可以转换为基本的 WHERE:

SELECT daily,
       SUM(total_balance) OVER (ORDER BY daily) AS total_value_per_day
FROM (
    SELECT
        DATE_TRUNC('DAY', (time)) AS daily,
        SUM(balance) AS total_balance
    FROM tbl
    WHERE is_spent_column IS NULL
    GROUP BY 1
) AS daily_agg
ORDER BY daily