sql - 过去 7 天的滚动总和,如何包括缺失日期 - postgresql

标签 sql postgresql

我想得到这样的东西,但我只有前两列:

dates          sales     rolling_sum7days           
01-01-2019     1         1
02-01-2019     3         4
03-01-2019     5         9
04-01-2019     2        11
05-01-2019     7        18
06-01-2019     8        26
08-01-2019    10        35
09-01-2019     1        32
10-01-2019     8        39       

我想出了这个,但还没有找到处理缺失值的方法,例如 07-01-2019 的销售额

SELECT dates 
sum(sales) over(order by dates ROWS BETWEEN 6 preceding AND CURRENT ROW) 
from table

我应该纠正什么? 发现了一些类似的问题,但他们没有解决这个问题。 例如:this

最佳答案

demo:db<>fiddle

SELECT
    gs::date as dates,
    COALESCE(mt.sales, 0) AS sales,
    sum(sales) over(order by gs ROWS BETWEEN 6 preceding AND CURRENT ROW)
FROM
    mytable mt
RIGHT OUTER JOIN 
    generate_series('2019-01-01', '2019-01-11', interval '1 day') gs
    ON gs = mt.dates

要在特定范围内填充缺失的日期,您可以为该日期范围使用 generate_series() 并进行外部连接。

如果您不想固定 gs 参数,那么您当然可以在之前计算它们,例如从您的表格中获取 MIN 和 MAX:

demo:db<>fiddle

WITH date_bounds AS (
    SELECT min(dates), max(dates) FROM mytable
)
SELECT
    gs::date as dates,
    COALESCE(mt.sales, 0) AS sales,
    sum(sales) over(order by gs ROWS BETWEEN 6 preceding AND CURRENT ROW)
FROM
    mytable mt
RIGHT OUTER JOIN 
    generate_series(
         (SELECT min FROM date_bounds), 
         (SELECT max FROM date_bounds), 
         interval '1 day'
    ) gs
    ON gs = mt.dates

关于sql - 过去 7 天的滚动总和,如何包括缺失日期 - postgresql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57969069/

相关文章:

MySQL:选择行直到达到更小的数字

postgresql - 用户 "postgres"的 Docker 密码验证失败

sql - 在 OPENQUERY 语句中使用“use”

mysql - 如何在 MySQL 中保留行计数器

SQL 计数问题

sql - 何时使用 DATE_TRUNC() 与 DATE_PART()?

ruby - 使用 postgres.app 在 rvm 下要求 pg 时出错

sql - 将表拆分为多对多关系 : Data Migration

mysql - 如何在变量中存储表达式并在单个 MySQL 查询中重用它们

sql - 获取给定日期之间的所有日期