23

redshift でシリーズ生成機能を使用したいのですが、うまくいきません。

redshift のドキュメントには、サポートされていないと書かれています。次のコードは機能します。

select *
from generate_series(1,10,1)

出力:

1
2
3
...
10

日付でも同じことをしたいと思います。次のようなさまざまなバリエーションを試しました。

select *
from generate_series(date('2008-10-01'),date('2008-10-10 00:00:00'),1)

キックアウト:

 ERROR: function generate_series(date, date, integer) does not exist
 Hint: No function matches the given name and argument types.
 You may need to add explicit type casts. [SQL State=42883]

また試しました:

select *
from generate_series('2008-10-01 00:00:00'::timestamp,
'2008-10-10 00:00:00'::timestamp,'1 day')

そして試しました:

select *
from generate_series(cast('2008-10-01 00:00:00' as datetime),
cast('2008-10-10 00:00:00' as datetime),'1 day')

両方がキックアウト:

ERROR: function generate_series(timestamp without time zone, timestamp without time zone, "unknown") does not exist
Hint: No function matches the given name and argument types.
You may need to add explicit type casts. [SQL State=42883]

そうでない場合は、別の投稿からこのコードを使用します。

SELECT to_char(DATE '2008-01-01'
+ (interval '1 month' * generate_series(0,57)), 'YYYY-MM-DD') AS ym

SQL 関数を引数として使用した PostgreSQL generate_series()

4

7 に答える 7

25

Amazon Redshift は PostgreSQL 8.0.2 をベースにしているようです。generate_series() へのタイムスタンプ引数は 8.4 で追加されました。

その問題を回避するこのようなものは、Redshift で機能する可能性があります。

SELECT current_date + (n || ' days')::interval
from generate_series (1, 30) n

これは、私がテストできる最も古いバージョンである PostgreSQL 8.3 で動作します。8.0.26 で文書化されています。

後で 。. .

generate_series() はRedshiftではサポートされていないようです。select * from generate_series(1,10,1) しかし、それが機能することを確認したことを考えると、上記の構文は少なくとも戦うチャンスを与えてくれます。(ただし、間隔データ型は、Redshift ではサポートされていないと記載されています。)

まだ後で。. .

整数のテーブルを作成することもできます。

create table integers (
  n integer primary key
);

好きなように入力してください。generate_series() をローカルで使用し、テーブルをダンプして、Redshift にロードできる場合があります。(わかりません。Redshift は使用していません。)

とにかく、generate_series() や interval データ型を直接参照しなくても、そのテーブルで簡単な日付計算を行うことができます。

select (current_date + n)
from integers
where n < 31;

少なくとも 8.3 では機能します。

于 2013-06-24T19:03:45.510 に答える
20

今日 Redshift を使用すると、datetime 関数を使用して数値テーブルを入力することで、日付の範囲を生成できます。

select (getdate()::date - generate_series)::date from generate_series(1,30,1)

私のためにこれを生成します

date
2015-11-06
2015-11-05
2015-11-04
2015-11-03
2015-11-02
2015-11-01
2015-10-31
2015-10-30
2015-10-29
2015-10-28
2015-10-27
2015-10-26
2015-10-25
2015-10-24
2015-10-23
2015-10-22
2015-10-21
2015-10-20
2015-10-19
2015-10-18
2015-10-17
2015-10-16
2015-10-15
2015-10-14
2015-10-13
2015-10-12
2015-10-11
2015-10-10
2015-10-09
2015-10-08
于 2015-11-07T00:51:33.607 に答える
12

このgenerate_series()関数は、Redshift によって完全にはサポートされていません。開発者ガイドの「サポートされていない PostgreSQL 関数」セクションを参照してください。

アップデート

generate_series は現在 Redshift と連携しています。

SELECT CURRENT_DATE::TIMESTAMP  - (i * interval '1 day') as date_datetime 
FROM generate_series(1,31) i 
ORDER BY 1

これにより、過去 30 日間の日付が生成されます

参照: Amazon Redshift の generate_series 関数

于 2014-04-01T09:54:32.393 に答える
2

私は似たようなことをする必要がありましたが、7 日間で 5 分間隔でした。ここにCTEベースのハックがあります(醜いですが冗長ではありません)

INSERT INTO five_min_periods
WITH 
periods  AS (select 0 as num UNION select 1 as num UNION select 2 UNION select 3 UNION select 4 UNION select 5 UNION select 6 UNION select 7 UNION select 8 UNION select 9 UNION select 10 UNION select 11),
hours    AS (select num from periods UNION ALL select num + 12 from periods),
days     AS (select num from periods where num <= 6),
rightnow AS (select CAST( TO_CHAR(GETDATE(), 'yyyy-mm-dd hh24') || ':' || trim(TO_CHAR((ROUND((DATEPART (MINUTE, GETDATE()) / 5), 1) * 5 ),'09')) AS TIMESTAMP) as start)
select  
  ROW_NUMBER() OVER(ORDER BY d.num DESC, h.num DESC, p.num DESC) as idx
  , DATEADD(minutes, -p.num * 5, DATEADD( hours, -h.num, DATEADD( days, -d.num, n.start ) ) ) AS period_date
from days d, hours h, periods p, rightnow n

これを他の生成スキームに拡張できるはずです。ここでのトリックは、デカルト積の結合 (つまり、JOIN/WHERE 句なし) を使用して手作りの CTE を乗算し、必要な増分を生成してアンカー日付に適用することです。

于 2017-09-06T10:33:17.810 に答える
0

Redshift の generate_series() 関数はリーダー ノードのみの関数であるため、計算ノードでのダウンストリーム処理には使用できません。これは、再帰的な CTE に置き換えることができます (またはデータベースに「日付」テーブルを保持します)。最近の回答にその例があります:

一連の日付で Redshift にクロス ジョインする

Redshift で頻繁に発生する可能性がある非常に大きなテーブルを操作する場合は、不等結合 (またはクロス結合または修飾されていない結合) に注意してください。たとえば 100 万行の適度な Redshift テーブルに参加している場合は、問題ありません。ただし、これを 10 億行のテーブルで実行すると、クエリがディスクに流出するため、データの急増によってパフォーマンスに大きな問題が発生する可能性があります。

この種のクエリをデータ スペースに依存する方法で記述する方法について、いくつかのホワイト ペーパーを作成しました。この大規模な中間結果の問題は Redshift に固有のものではなく、私は最初にクライアントの HIVE クエリの問題を解決するアプローチを開発しました。「ビッグデータ用の SQL を作成するための最初のルール - それ以上作成しないでください」

于 2021-12-17T16:43:19.557 に答える