postgresql - SUM OVER PARTITION ON 日期范围

标签 postgresql cumulative-sum

我正在尝试对 Postgres 中的每一行在特定时间段内进行累计求和,例如:

|---------------------|------------------|------------------|
|      Date           |     Value        |     Employee     |
|---------------------|------------------|------------------|
|  25-01-1990         |         34       |      Aaron       |
|---------------------|------------------|------------------|
|  15-02-1990         |         4        |      Aaron       |
|---------------------|------------------|------------------|
|  02-03-1990         |         3        |      Aaron       |
|---------------------|------------------|------------------|
|  22-05-1990         |         7        |      Aaron       |
|---------------------|------------------|------------------|

预期结果,范围为 60 天:

|---------------------|------------------|------------------|
|      Date           |     Value        |    Employee      |
|---------------------|------------------|------------------|
|  25-01-1990         |         34       |      Aaron       |
|---------------------|------------------|------------------|
|  15-02-1990         |         38       |      Aaron       |
|---------------------|------------------|------------------|
|  02-03-1990         |         41       |      Aaron       |
|---------------------|------------------|------------------|
|  01-05-1990         |         10       |      Aaron       |
|---------------------|------------------|------------------|

我尝试了以下但结果不正确:

WITH tab AS (SELECT * FROM table_with_values)
SELECT tab.Date, SUM(tab.Value) 
FILTER (WHERE tab.Date<=tab.Date AND tab.Date >=t.Date - INTERVAL '60 DAY')
OVER(PARTITION BY tab.Employee ORDER BY tab.Date ROWS BETWEEN UNBOUND PRECEDENT AND CURRENT ROW)
AS values_cumulative, tab.Employee
FROM tab

最佳答案

试试这个:

SELECT date, employee, sum(bvalue)
FROM (
     SELECT a.*, b.date as bdate, b.value as bvalue
     FROM testtable a
     LEFT JOIN testtable b ON
               a.employee = b.employee AND
               b.date <= a.date AND
               b.date >= a.date - integer '60') c
GROUP BY employee, date
ORDER BY date ASC;


    date    | employee | sum
------------+----------+-----
 1990-01-25 | Aaron    |  34
 1990-02-15 | Aaron    |  38
 1990-03-02 | Aaron    |  41
 1990-05-01 | Aaron    |  10
(4 Zeilen)

关于postgresql - SUM OVER PARTITION ON 日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56624643/

相关文章:

algorithm - 找到完全改变累积和集的排列

java - 无法运行总计

c++ - 如何保持二维数组的总计

Mysql如何按组查找累计总计

postgresql - 冲突列上的 Postgres 10 与返回表中的列同名 = 不明确

sql - 使用 Postgres 聚合函数选择每个 GROUP BY 组中的第一行?

postgresql - 当数据库中存在表时出现sqlalchemy NoSuchTableError

postgresql - 不再识别 PostGIS 几何数据类型

sql-server - 使用具有滚动总和的 SQL Over 语句

java - hibernate 和 postgres 中生成的 @Id 的数据类型是什么?