2016-09-29 8 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」というエラーがあります。 I使用しても試みた後、エラーが発生し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

私は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まで)。この例は、より多くの/より高い数字をカバーします

1

Redshiftはgenerate_seriesを完全にサポートしておらず、独自に使用することができますが、生成するデータは他のどのような赤色シフト機能とも結合できません。

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

テーブル内の日付のこのリストの利用可能なソースがありますが、これを次のように

あなたの最良のオプションは、日ごとに1行で赤方偏移のテーブルを作成するために、そして参加してそのテーブルを使用することですテーブルはしばしば日付ディメンションと呼ばれ、スタースキーマのデータウェアハウス内で使用されます。

sisense date dimension

ことが、その後、CSV

はに日付をロードするために、赤方偏移のCOPYコマンドを使用して保存、日付のリストを生成するために、たとえばExcelを使用して同じように簡単ではあり赤いシフトテーブル。

+0

ああ、これを避けようとしていましたが、多くの選択肢がないように見えました。私もtempテーブルに日付をロードしようとしましたが、あなたが言うように、それを何かと組み合わせると、挿入物さえも動作しません。 – MartinM

+0

私は興味のある答えを提供しました:) – MartinM

関連する問題