Redshift SQL:如何获取今天的计数和前 3 天的计数总和

Posted

技术标签:

【中文标题】Redshift SQL:如何获取今天的计数和前 3 天的计数总和【英文标题】:Redshift SQL: How to get today's count and sum of counts from previous 3 days 【发布时间】:2019-10-15 17:22:31 【问题描述】:

我有一张表,上面有日期和一些计数,如下所示:

| Date       | Count |
| 2019-01-02 | 100   |
| 2019-01-03 | 101   |
| 2019-01-04 |  99   |
| 2019-01-05 |  95   |
| 2019-01-06 |  90   |
| 2019-01-07 |  88   |

鉴于此表,我要计算的是对每个日期前 3 天的计数求和,如下所示:

| Date       | Prev3DaysCount |
| 2019-01-02 |    0  |
| 2019-01-03 |  100  |
| 2019-01-04 |  201  |
| 2019-01-05 |  300  |
| 2019-01-06 |  295  |
| 2019-01-07 |  284  |

例如,2019 年 1 月 7 日的 Prev3DaysCount 284 来自 (99+95+90) 的前 3 天。我想我可以使用 SUM 窗口功能,但我不知道如何将窗口限制为前 3 天。

【问题讨论】:

你一天总是有一行吗?是否有缺失的日期值(如果有,缺失值是否应计入“前 3 天”)? 是的,每天只有一行,没有缺一天。 【参考方案1】:

您可以使用窗口函数(连同COALESCEnull(第一行)转换为0):

SELECT
  day,
  COALESCE(
    SUM(count) OVER (ORDER BY day ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING),
    0
  ) AS Prev3DaysCount
FROM t;

返回:

┌────────────┬────────────────┐
│    day     │ prev3dayscount │
├────────────┼────────────────┤
│ 2019-01-02 │              0 │
│ 2019-01-03 │            100 │
│ 2019-01-04 │            201 │
│ 2019-01-05 │            300 │
│ 2019-01-06 │            295 │
│ 2019-01-07 │            284 │
└────────────┴────────────────┘
(5 rows)

【讨论】:

谢谢@marth。如果过去 3 天内有任何缺失天数怎么办?我还没有这种情况,但将来可能会! @kee:您需要在包含所有日期列表(涵盖您的应用程序使用的日期范围)的“日期”表上LEFT JOIN 来填补空白。在 Postgresql 上,您通常会使用 generate_series(),但我不认为它在 Redshift 上可用。

以上是关于Redshift SQL:如何获取今天的计数和前 3 天的计数总和的主要内容,如果未能解决你的问题,请参考以下文章

AWS Redshift SQL - PIVOT 查询(一行/行多次计数)

如何将此代码从 oracle 转换为 redshift?

从 Redshift 表中获取 JSON 数据

SQL(Redshift)获取多个表的交集

如何使用 AWS Redshift Data API 使用 Java 执行 SQL? [关闭]

使用 Redshift (PostgreSQL) 和计数的数据透视表