2016-09-29 20 views
0

我有红移一个表,有一个日期列加上其他一些数据:获取从表中缺少日期在红移

+------------+-------+ 
| 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中可以实现吗?

回答

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个值(在选择中达到p3)。这个例子将覆盖更多/更高的数字

1

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

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

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

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

例如 sisense date dimension

这可能是一样容易使用Excel,例如生产日期的列表,然后保存为一个CSV

使用红移COPY命令加载日期中一个红移的桌子。

+0

啊好吧试图避免这一点,但看起来没有太多的选择。我也尝试将日期加载到临时表中,但是,正如你所说,如果将它与任何东西结合 - 即使是插入,它也不起作用 – MartinM

+0

我提供了一个可能感兴趣的答案:) – MartinM