GROUP BY TIMEルールと制限 - Teradata Database - Teradata Vantage NewSQL Engine

Teradata Vantage™ 時系列テーブルおよび操作

Product
Teradata Database
Teradata Vantage NewSQL Engine
Release Number
16.20
Published
2019年3月
Language
日本語
Last Update
2019-10-29
dita:mapPath
ja-JP/sfz1493079039055.ditamap
dita:ditavalPath
ja-JP/sfz1493079039055.ditaval
dita:id
B035-1208
Product Category
Software
Teradata Vantage

GROUP BY TIMEとGROUP BYは、同じクエリーで一緒に使用することはできません(この制限はGROUP BY ROLLUP、GROUP BY CUBEなどを含みます)。

非PTIテーブルでGROUP BY TIMEを使用する場合は、USING TIMECODE句を含める必要があります。そうしないと、エラーが報告されます。

サポートされている時系列関数は、GROUP BY TIME句と組み合わせて使用する必要があります。そうしないと、エラーが報告されます。

タイムバケット(指定されている場合、グループ化の最初のレベルとして機能する)は、タイム ゼロに基づいて計算されます。時間ゼロの計算方法の詳細については、GROUP BY TIME - タイム ゼロ値を参照してください。

グループ化は、まずタイムバケットによって決定され、次にGROUP BY TIME句で指定された他のすべてのフィールド(ある場合)によって決定されます。GROUP BY TIME句では、タイムバケット期間が必要です。それを含めないとエラーになります。

HAVING句は、GROUP BY TIME句を使用して集約の結果をフィルタリングするためにサポートされています。

QUALIFYおよびWITH...BY句は、GROUP BY TIME句が存在する場合にはサポートされません。

USING TIMECODEおよびFILL句は省略可能であり、GROUP BY TIME句でのみ使用できます。

GROUP BY TIMEクエリーでUSING TIMECODE句を省略できるのは、PTIテーブルであるGROUP BY TIME句のスコープ内の任意の場所に単一のソースが存在する場合のみです。

タイムコード列は、タイムコード列がPTIテーブルのシステム生成TD_TIMECODE列であってもUSING TIMECODE句に指定されたものであっても、GROUP BY TIME句内でvalue_expressionとして指定することはできません。同様に、連番列(TD_SEQNOまたはUSING TIMECODE句のseqno_col)は、GROUP BY TIME句内でvalue_expressionとして指定することはできません。

PTIテーブルは、TD_TIMECODEおよびTD_SEQNO列が非NULLである必要があります。USING TIMECODE句を使用してタイムコードまたはシーケンス番号列を指定すると、これらの列ではNULL値を持つ行がフィルタで除外されます。次にこの例を示します。

CREATE SET TABLE aggr_table ,NO FALLBACK ,
     NO BEFORE JOURNAL,
     NO AFTER JOURNAL,
     CHECKSUM = DEFAULT,
     DEFAULT MERGEBLOCKRATIO
     (
      TD_TIMECODE TIMESTAMP(6) NOT NULL GENERATED TIMECOLUMN,
      col1 DECIMAL(20,5),
      vc VARCHAR(20) CHARACTER SET LATIN NOT CASESPECIFIC,
      ts TIMESTAMP(6))
 PRIMARY TIME INDEX (TIMESTAMP(6), DATE '2000-01-01', COLUMNS(col1), NONSEQUENCED);

SEL $TD_TIMECODE_RANGE, $TD_GROUP_BY_TIME, MODE(col1) 
FROM aggr_table
GROUP BY TIME(CAL_YEARS(100)) 
USING TIMECODE(ts)
order by 1,2,3;

USING TIMECODE句により、"ts"列に次の条件を含めるように、クエリーを内部的に書き換えることができます。

SEL $TD_TIMECODE_RANGE, $TD_GROUP_BY_TIME, MODE(col1) 
FROM aggr_table
WHERE ts IS NOT NULL
GROUP BY TIME(CAL_YEARS(100)) 
USING TIMECODE(ts)
order by 1,2,3;

暗黙的に追加された条件は、AND条件を使用して任意の既存の条件に連鎖します。

無制限の時間を指定された時系列クエリー(GROUP BY TIME(*))は、SELECTリストで指定されたDELTA_T集約を最大で1つ持つことができます。DELTA_Tは、無制限の時間で使用できる唯一の集約関数です。

制限

GROUP BY TIMEは、基本PTIテーブルに直接適用された場合にのみ動作します。結合を含むその他の場合は、USING TIMECODEを使用して、時系列集約のタイムコード列を明示的に指定します。例えば、次のようになります。

ct t1(a1 int, b1 int, c1 int) primary index (a1);
insert into t1(0,0,0);
insert into t1(1,1,1);
 
The join spool is just like any other join in Teradata. There is nothing specific to Time Series.

SELECT * FROM OCEAN_BUOYS, t1 WHERE TD_TIMECODE BETWEEN TIMESTAMP '2014-01-06 08:00:00' AND TIMESTAMP '2014-01-06 10:30:00' AND buoyid = t1.b1;
 

結果:

TD_TIMECODE BUOYID SALINITY TEMPERATURE a1 b1 c1
2014-01-06 09:02:25.122200 1 55 78 1 1 1
2014-01-06 08:00:00.000000 0 55 10 0 0 0
2014-01-06 09:02:25.122200 1 55 71 1 1 1
2014-01-06 08:08:59.999999 0 55 ? 0 0 0
2014-01-06 09:03:25.122200 1 55 79 1 1 1
2014-01-06 08:10:00.000000 0 55 10 0 0 0
2014-01-06 09:01:25.122200 1 55 70 1 1 1
2014-01-06 08:09:59.999999 0 55 99 0 0 0
2014-01-06 09:03:25.122200 1 55 72 1 1 1
2014-01-06 08:10:00.000000 0 55 100 0 0 0
2014-01-06 09:01:25.122200 1 55 77 1 1 1