【问题标题】:Group values by date in a generated timeseries在生成的时间序列中按日期对值进行分组
【发布时间】:2018-10-02 15:42:05
【问题描述】:

我有一张名为“daily_budgets”的表格:

+----+------------+----------+--------------+
| id | start_date | end_date | daily_budget |
+----+------------+----------+--------------+
| 1  | 25/04/18   | 29/04/18 | 500          |
+----+------------+----------+--------------+
| 2  | 26/04/18   | 27/04/18 | 1000         |
+----+------------+----------+--------------+

显示项目在指定时间范围(开始日期 - 结束日期)之间的每日预算。

然后我有另一个叫做“year_2018”的地方,我生成了一个包含 2018 年所有日期的 time_series:

+----------+
| date     |
+----------+
| 01/01/18 |
+----------+
| 02/01/18 |
+----------+
| 03/01/18 |
+----------+
| 04/01/18 |
+----------+
| 05/01/18 |
+----------+
etc.

现在我只想加入这两个表,以便获得按日期分组的daily_budget 总数。结果表中的第一个日期应该是表“daily_budgets”中的最小开始日期。

+----------+--------------+
| date     | daily_budget |
+----------+--------------+
| 25/04/18 | 500          |
+----------+--------------+
| 26/04/18 | 1500         |
+----------+--------------+
| 27/04/18 | 1500         |
+----------+--------------+
| 28/04/18 | 500          |
+----------+--------------+
| 29/04/18 | 500          |
+----------+--------------+

非常感谢您的帮助!

我正在使用:i686-pc-linux-gnu 上的 PostgreSQL 8.0.2,由 GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)、Redshift 1.0.2058 编译

【问题讨论】:

    标签: group-by time-series amazon-redshift


    【解决方案1】:

    在日历表中的日期介于(包括)开始和结束预算日期之间的条件下加入这两个表。然后按日期聚合以生成总数。

    SELECT
        c.date,
        SUM(daily_budget) AS daily_budget
    FROM year_2018 c
    INNER JOIN daily_budgets db
        ON c.date BETWEEN db.start_date AND db.end_date
    GROUP BY
        c.date;
    

    请注意,我在这里使用了内部联接,它的作用是过滤掉日历表中未出现在预算表中至少一条记录中的任何日期。这应该强制您看到报告的最早日期也是预算表中的最早日期。

    【讨论】:

    • 非常感谢@Tim Biegeleisen — 完美运行 :-)
    猜你喜欢
    • 2013-01-16
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 2023-03-24
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    相关资源
    最近更新 更多