在Redshift中从表中获取缺少日期

时间:2016-09-29 10:02:49

标签: sql database postgresql amazon-redshift

我在Redshift中有一个表,其中包含Date列和其他一些数据:

+------------+-------+
|    Date    | Value |
+------------+-------+
| 2016-09-25 |     1 |
| 2016-09-28 |     2 |
| 2016-09-29 |     3 |
+------------+-------+

我希望得到"失踪"该表的日期。所以,从上面的例子中我想要从7天前到现在都知道所有缺失的日期,我想生成一个返回的查询:

2016-09-22
2016-09-23
2016-09-24
2016-09-26
2016-09-27

我尝试使用generate_series(..)函数生成所有日期,然后将其过滤掉我表中已存在的日期。所以,像:

    select CURRENT_DATE + i as MyDate
from generate_series(date '2016-09-22'- CURRENT_DATE, date '2016-09-29' - CURRENT_DATE ) i 
where MyDate not in (select [Date] from MyTable)

在这种情况下,我有错误" MyDate"不存在。我还试过使用和EXCEPT子句然后产生错误:

INFO:  Function "generate_series(integer,integer)" not supported.

[Err] ERROR:  Specified types or functions (one per INFO message) not supported on Redshift tables.

我尝试过的其他各种事情产生了这个错误,我可以在它自己运行时运行generate_series(..),但是如果我尝试使用任何其他子句等它就会失败。

这可以在Redshift中实现吗?

2 个答案:

答案 0 :(得分:1)

Redshift不完全支持generate_series,我发现你可以自己使用它,但是它生成的数据无法以任何方式与任何其他redshift功能结合。

您最好的选择是创建一个每天一行的红移表,并在连接中使用该表,如下所示

select date from dates_table
where date not in (select date from my_table)

表格中有这个日期列表可用的来源,此表通常被称为日期维度,并在星型模式数据仓库中使用。

例如,

sisense date dimension

例如,使用Excel可以轻松生成日期列表,然后另存为CSV

使用redshift COPY命令将日期加载到红移表中。

答案 1 :(得分:1)

我设法找到一种解决方法,它涉及另一种生成一系列数字而不使用generate_series(..)的方法。不确定它的性能如何,但这可能会有所帮助。相信我在下面找到的博客。在他们的例子中,我认为他们建议将数字转储到一个表中并使用它,但在下面我只使用了一个子查询来显示:

https://discourse.looker.com/t/generating-a-numbers-table-in-mysql-and-redshift/482

SELECT CURRENT_DATE - CAST ( days AS INT ) AS [Date]
FROM
 (SELECT 
    CAST (p0.n + p1.n*2 + p2.n * POWER(2,2) + p3.n * POWER(2,3)+ p4.n * POWER(2,4)+ p5.n * POWER(2,5) AS INT) AS days
      FROM 
        (SELECT 0 as n UNION SELECT 1) p0,
        (SELECT 0 as n UNION SELECT 1) p1,
        (SELECT 0 as n UNION SELECT 1) p2,
        (SELECT 0 as n UNION SELECT 1) p3,
        (SELECT 0 as n UNION SELECT 1) p4,
        (SELECT 0 as n UNION SELECT 1) p5
WHERE (p0.n + p1.n*2 + p2.n * POWER(2,2) + p3.n * POWER(2,3)+ p4.n * POWER(2,4)+ p5.n * POWER(2,5)) <= 7
)
EXCEPT
SELECT Date FROM MyTable

注意:在我的原始示例中,我只需要前3个值(在select中最多为p3)。此示例将涵盖更多/更高的数字