【问题标题】:How to make projections with future dates using Redshift如何使用 Redshift 对未来日期进行预测
【发布时间】:2018-05-09 22:27:36
【问题描述】:

我目前有一个名为 quantities 的表格,其中包含以下数据:

+------+----------+----------+
| item | end_date | quantity |
+------+----------+----------+
| 1    | 26/11/17 | 100      |
+------+----------+----------+
| 2    | 28/11/17 | 300      |
+------+----------+----------+
| 3    | 30/11/17 | 500      |
+------+----------+----------+

我想查询它,所以我可以得到这个结果:

+--------+-------+
| date   | total |
+--------+-------+
| 26-Nov | 900   |
+--------+-------+
| 27-Nov | 800   |
+--------+-------+
| 28-Nov | 800   |
+--------+-------+
| 29-Nov | 500   |
+--------+-------+
| 30-Nov | 500   |
+--------+-------+

这个查询会是什么样子?非常感谢!

请注意:

上面的输出是当今天的日期=

+--------+-----+-----+-----+-------+
| date   | 1   | 2   | 3   | total |
+--------+-----+-----+-----+-------+
| 26-Nov | 100 | 300 | 500 | 900   |
+--------+-----+-----+-----+-------+
| 27-Nov | -   | 300 | 500 | 800   |
+--------+-----+-----+-----+-------+
| 28-Nov | -   | 300 | 500 | 800   |
+--------+-----+-----+-----+-------+
| 29-Nov | -   | -   | 500 | 500   |
+--------+-----+-----+-----+-------+
| 30-Nov | -   | -   | 500 | 500   |
+--------+-----+-----+-----+-------+

我需要查询始终提供具有以下日期范围的输出:

  • 开始日期=当前日期
  • end_date=项目列表中最新的 end_date

我在 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.1499 编译

【问题讨论】:

  • 请更新您的问题以从标题和标签中删除单词 postgres。 Redshift IS NOT postgres 8.0.2 有很多变化!
  • @JonScott 现在完成了,谢谢!

标签: sql date amazon-redshift future projection


【解决方案1】:
t=# create table so (item serial, end_date date, quantity int);
CREATE TABLE
t=# set datestyle TO DMY;
SET
t=# insert into so(end_date,quantity) values('26-11-2017',100),('28-11-2017', 300), ('30-11-2017', 500);
INSERT 0 3

然后,我们使用具有顺序 id 列的表创建一个包含从今天开始进入未来的日期序列的视图:

CREATE VIEW future_dates AS
SELECT (getdate()::date -1 + id)::date as future_dates
FROM app_data.table_with_sequential_id
ORDER BY  future_dates

注意我们需要创建上述视图,因为 Redshift 不完全支持 generate_series。

最后选择自己:

t=# select gs::date,  sum(quantity) over (order by gs desc rows unbounded preceding)
from future_dates gs
left outer join so on so.end_date = gs
order by gs ;
     gs     | sum
------------+-----
 2017-11-26 | 900
 2017-11-27 | 800
 2017-11-28 | 800
 2017-11-29 | 500
 2017-11-30 | 500
(5 rows)

【讨论】:

  • 非常感谢您的及时回复。除了 Redshift 中不完全支持的 generate_series 函数外,您的答案有效。是否有任何替代方案可以生成未来的系列?谢谢@Vao Tsun!
  • 刚刚在 Redshift 中找到了 generate_series 的替代方法:最简单的方法是使用具有顺序 id 列的表,然后从该表中选择 id 列来生成日期系列。另一方面,这是我目前遇到的另一个错误:Aggregate window functions with an ORDER BY clause require a frame clause任何想法@VaoTsun?
  • 啊 - 我错过了红移标签。我相信它是基于古老的 postgres 版本,所以窗口功能会受到限制。唉,我已经 10 年没有使用 postgres 8 练习了,所以不会猜测 redshift 的工作代码
  • 所以要解决上述错误,查询需要具有以下内容:(order by gs desc rows unbounded preceding)。这样它就会起作用;不知道为什么。谢谢@VaoTsun!
  • 不知道为什么这被标记为正确答案,因为它对红移不起作用!请取消标记为正确或更新为正确?
猜你喜欢
  • 2020-06-01
  • 2019-08-09
  • 1970-01-01
  • 2015-08-08
  • 2020-08-19
  • 2018-07-23
  • 2022-12-13
  • 1970-01-01
  • 2017-03-14
相关资源
最近更新 更多