2016-09-29 55 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