我在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中实现吗?
答案 0 :(得分:1)
Redshift不完全支持generate_series,我发现你可以自己使用它,但是它生成的数据无法以任何方式与任何其他redshift功能结合。
您最好的选择是创建一个每天一行的红移表,并在连接中使用该表,如下所示
select date from dates_table
where date not in (select date from my_table)
表格中有这个日期列表可用的来源,此表通常被称为日期维度,并在星型模式数据仓库中使用。
例如,例如,使用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)。此示例将涵盖更多/更高的数字