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句でのみ使用できます。
タイムコード列は、タイムコード列が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 |