16.20 - GROUP BY TIME - タイム ゼロ値 - Teradata Vantage NewSQL Engine

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

prodname
Teradata Database
Teradata Vantage NewSQL Engine
vrm_release
16.20
category
プログラミング リファレンス
featnum
B035-1208-162K-JPN

すべてのGROUP BY TIME操作には、タイム ゼロの値が関連付けられています。

時系列クエリーに関連付けられている時間範囲が1つだけの場合、タイム ゼロの値は、その範囲に関連付けられている開始時刻と等しくなります。例えば、次のような文では、
SELECT … WHERE TD_TIMECODE BETWEEN a and b
aがタイム ゼロの値です。

時系列クエリーに複数の時間範囲が(ORを間に挟んで)指定されている場合、タイム ゼロの値は、WHERE句で指定された時間範囲の中で最も古い開始時間に対応する値になります。例えば、次のような文では、

SELECT ... WHERE TD_TIMECODE BETWEEN a AND b OR TIMECODE BETWEEN c AND d OR
TIMECODE BETWEEN e AND f

各範囲からの開始時間(この場合、a、c、e)が比較され、最も早い時間を持つものがタイム ゼロの値になります。

時系列クエリーに時間範囲が指定されていない場合、GROUP BY TIME操作は時系列の時間スコープ全体に適用されます。タイム ゼロの値は、この時系列クエリーが発行されているPTIテーブルに関連付けられたタイム ゼロの値に設定されます。または、PTIテーブルが存在しない場合、タイム ゼロはUNIXエポック時刻(1970-01-01 00:00:00)に設定されます。

USING TIMECODE句が指定されている場合、タイム ゼロの値に使用される列は、USING TIMECODE句で指定された列です。

次のルールは、タイム ゼロの計算方法について説明しています。

ルール1: リテラル定数

タイムコードの値は、リテラル定数またはリテラル定数に評価される式からのみ計算できます。例:
  • TIMESTAMP '01-01-31 08:00:00'などの値を指定できます。
  • 式がリテラルに評価される場合、ADD_MONTHS(TIMESTAMP '2013-12-06 08:00:00', 1)などの式を指定できます。
  • タイムコードの範囲には、列参照を含めることはできません。

例:

/*PTI Table*/

SELECT $TD_TIMECODE_RANGE, $TD_GROUP_BY_TIME, BUOYID, AVG(TEMPERATURE), COUNT(*) FROM OCEAN_BUOYS

WHERE TD_TIMECODE BETWEEN ADD_MONTHS(TIMESTAMP '2013-12-06 08:00:00', 1) AND TIMESTAMP '2014-01-06 10:30:00'

GROUP BY TIME (MINUTES(10) AND BUOYID)

ORDER BY 2, 3;

結果:

TIMECODE_RANGE GROUP BY TIME(MINUTES(10)) BUOYID Average(TEMPERATURE) COUNT(*)
('2014-01-06 08:00:00.000000+00:00', '2014-01-06 08:10:00.000000+00:00') 1 0 54 3
('2014-01-06 08:10:00.000000+00:00', '2014-01-06 08:20:00.000000+00:00') 2 0 55 2
('2014-01-06 09:00:00.000000+00:00', '2014-01-06 09:10:00.000000+00:00') 7 1 74 6
('2014-01-06 10:00:00.000000+00:00', '2014-01-06 10:10:00.000000+00:00') 13 44 50 10
('2014-01-06 10:10:00.000000+00:00', '2014-01-06 10:20:00.000000+00:00') 14 44 43 1

ルール2: リテラルは互換性のあるデータ型である必要がある

タイムコード リテラルは、タイムコードフィールドのデータ型に変換できるデータ型である必要があります(推測されるTD_TIMECODEまたはUSING TIMECODE句で指定された明示的な列のいずれか)。前の例(ルール1: リテラル定数)はこれを示しています。

ルール3: 述部はTIMECODEの範囲に変換可能でなければならない

タイムコードに対する述部(推測されるTD_TIMECODEまたはUSING TIMECODE句で指定された明示的な列のいずれか)は、1つまたは複数のタイムコードでなる一連の範囲に変換できる必要があります。
  • 複数の範囲をORで接続することができます。
  • タイムバケット番号(例えば、1、2、3)を割り当てる場合、最も早い開始点(負の無限大に最も近いもの)がタイム ゼロとして扱われます。つまり、タイム ゼロの後の各タイムバケットには、このタイム ゼロ(特定の範囲の開始点ではなく、すべての範囲の開始点)に基づいて計算されたそれ自体のタイムバケット番号があります。
  • 指定された範囲内のすべての空のタイムバケットは、FILL句で指定されたとおりに埋められます。指定された範囲に基づいて除外されたタイムバケットは埋められません。
SELECT $TD_TIMECODE_RANGE, $TD_GROUP_BY_TIME, BUOYID, AVG(TEMPERATURE), COUNT(*) FROM OCEAN_BUOYS

WHERE TD_TIMECODE BETWEEN TIMESTAMP '2014-01-06 08:00:00' AND TIMESTAMP '2014-01-06 08:30:00' OR

TD_TIMECODE BETWEEN TIMESTAMP '2014-01-06 10:00:00' AND TIMESTAMP '2014-01-06 10:30:00'

GROUP BY TIME (MINUTES(10) AND BUOYID)

ORDER BY 2, 3;

 *** Query completed. 4 rows found. 5 columns returned.

 *** Total elapsed time was 1 second.

結果:

TIMECODE_RANGE GROUP BY TIME(MINUTES(10)) BUOYID Average(TEMPERATURE) COUNT(*)
('2014-01-06 08:00:00.000000+00:00', '2014-01-06 08:10:00.000000+00:00') 1 0 54 3
('2014-01-06 08:10:00.000000+00:00', '2014-01-06 08:20:00.000000+00:00') 2 0 55 2
('2014-01-06 10:00:00.000000+00:00', '2014-01-06 10:10:00.000000+00:00') 13 44 50 10
('2014-01-06 10:10:00.000000+00:00', '2014-01-06 10:20:00.000000+00:00') 14 44 43 1

ルール4: 開始点は負の無限大で、終了点はリテラルである

範囲の開始点が負の無限大で、終了点がリテラルである場合は、以下が適用されます。
  • GROUP BY TIMEタイムバケット番号の割り当ての場合:
    • ソース テーブルがPTIテーブルの場合、ソース テーブルに関連付けられたタイム ゼロがタイムバケット番号を生成するために使用されます。
    • ソース テーブルがPTIテーブルでない場合、EPOCH時間がタイムバケット番号を生成するために使用されます。
  • FILL句の場合、処理された各系列は個別に考慮されます。
    • その特定の系列に関連付けられている開始時刻(その系列に関連する最初の時間)は、最初の関連するタイムバケットです。
    • 最初のタイムバケットと指定された終了点の間に検出された欠落しているタイムバケットは埋められます。
SELECT $TD_TIMECODE_RANGE, $TD_GROUP_BY_TIME, BUOYID, AVG(TEMPERATURE), COUNT(*)
FROM OCEAN_BUOYS
WHERE TD_TIMECODE <=  TIMESTAMP '2014-01-06 09:00:00'
GROUP BY TIME (MINUTES(10) AND BUOYID)
ORDER BY 2, 3;

結果:

TIMECODE_RANGE GROUP BY TIME(MINUTES(10)) BUOYID Average(TEMPERATURE) COUNT(*)
('2014-01-06 08:00:00.000000+00:00', '2014-01-06 08:10:00.000000+00:00') 106033 0 54 3
('2014-01-06 08:10:00.000000+00:00', '2014-01-06 08:20:00.000000+00:00') 106034 0 55 2

ルール5: 開始点はリテラルで、終了点は正の無限大である

範囲の開始点にリテラルが指定され、終了点が正の無限大である場合は、以下が適用されます。
  • GROUP BY TIMEの場合、指定されたリテラルの開始点は、タイムバケット番号の割り当てに使用されたタイム ゼロの値です。
  • FILL句の場合、処理された各系列は個別に考慮されます。
    • 指定された開始時刻はタイム ゼロです。
    • 各系列には、その最後のタイムバケットを構成するGROUP BY TIMEタイムバケットに属する最後の行が関連付けられます。
    • 最初のタイムバケット(開始時刻によって指定)と終了点のタイムバケットの間の欠落しているタイムバケットは埋められます。
SELECT $TD_TIMECODE_RANGE, $TD_GROUP_BY_TIME, BUOYID, AVG(TEMPERATURE), COUNT(*)
FROM OCEAN_BUOYS
WHERE TD_TIMECODE >=  TIMESTAMP '2014-01-06 08:00:00'
GROUP BY TIME (MINUTES(10) AND BUOYID)
ORDER BY 2, 3;

結果:

TIMECODE_RANGE GROUP BY TIME(MINUTES(10)) BUOYID Average(TEMPERATURE) COUNT(*)
('2014-01-06 08:00:00.000000+00:00', '2014-01-06 08:10:00.000000+00:00') 1 0 54 3
('2014-01-06 08:10:00.000000+00:00', '2014-01-06 08:20:00.000000+00:00') 2 0 55 2
('2014-01-06 09:00:00.000000+00:00', '2014-01-06 09:10:00.000000+00:00') 7 1 74 6
('2014-01-06 10:00:00.000000+00:00', '2014-01-06 10:10:00.000000+00:00') 13 44 50 10
('2014-01-06 10:10:00.000000+00:00', '2014-01-06 10:20:00.000000+00:00') 14 44 43 1
('2014-01-06 10:30:00.000000+00:00', '2014-01-06 10:40:00.000000+00:00') 16 44 43 1
('2014-01-06 10:50:00.000000+00:00', '2014-01-06 11:00:00.000000+00:00') 18 44 43 1
('2014-01-06 21:00:00.000000+00:00', '2014-01-06 21:10:00.000000+00:00') 79 2 81 3

ルール6: 開始点は負の無限大で、終了点は正の無限大である

範囲の開始点が負の無限大であり、範囲の終了点が正の無限大である場合(例えば、SELECT BUOYID、AVG(TEMP) FROM T1 GROUP BY TIME(MINUTES(15) AND BUOYID)は、以下が適用されます。
  • GROUP BY TIMEタイムバケット番号の割り当ての場合:
    • ソース テーブルがPTIの場合、ソース テーブルに関連付けられたタイム ゼロがタイムバケット番号を生成するために使用されます。
    • ソース テーブルがPTIでない場合、EPOCH時間がタイムバケット番号を生成するために使用されます。
  • FILL句の場合、処理された各系列は個別に考慮されます。
    • その特定の系列に関連付けられている開始時刻(その系列に関連する最初の行)は、最初の関連するタイムバケットです。
    • 特定の系列に関連付けられている終了時刻(その系列に関連する最後の行)は、最後の関連するタイムバケットです。
    • 最初の関連するタイムバケットと最後の関連するタイムバケット点の間に検出されたすべての欠落したタイムバケットは埋められます。これは、処理される系列ごとに繰り返されます。
SELECT $TD_TIMECODE_RANGE, $TD_GROUP_BY_TIME, BUOYID, AVG(TEMPERATURE), COUNT(*)
FROM OCEAN_BUOYS
GROUP BY TIME (MINUTES(10) AND BUOYID)
ORDER BY 2, 3;

結果:

TIMECODE_RANGE GROUP BY TIME(MINUTES(10)) BUOYID Average(TEMPERATURE) COUNT(*)
('2014-01-06 08:00:00.000000+00:00', '2014-01-06 08:10:00.000000+00:00') 106033 0 54 3
('2014-01-06 08:10:00.000000+00:00', '2014-01-06 08:20:00.000000+00:00') 106034 0 55 2
('2014-01-06 09:00:00.000000+00:00', '2014-01-06 09:10:00.000000+00:00') 106039 1 74 6
('2014-01-06 10:00:00.000000+00:00', '2014-01-06 10:10:00.000000+00:00') 106045 44 50 10
('2014-01-06 10:10:00.000000+00:00', '2014-01-06 10:20:00.000000+00:00') 106046 44 43 1
('2014-01-06 10:30:00.000000+00:00', '2014-01-06 10:40:00.000000+00:00') 106048 44 43 1
('2014-01-06 10:50:00.000000+00:00', '2014-01-06 11:00:00.000000+00:00') 106050 44 43 1
('2014-01-06 21:00:00.000000+00:00', '2014-01-06 21:10:00.000000+00:00') 106111 2 81 3

例: タイムコードがタイム ゼロの前に付くWHERE句の結果

計算されたタイム ゼロ未満のタイムコードを持つ行が読み取られるように、WHERE句を構造化できます。例:

CREATE TABLE complexTimeZero(BUOYID INTEGER, SALINITY INTEGER, TEMPERATURE INTEGER )

PRIMARY TIME INDEX (TIMESTAMP(6), DATE '2012-01-01', HOURS(1), COLUMNS(BUOYID), nonsequenced);

INSERT INTO complexTimeZero VALUES(TIMESTAMP '2013-01-06 10:00:24.000000', 1, 55, 43);

INSERT INTO complexTimeZero VALUES(TIMESTAMP '2014-01-06 10:00:24.333300', 44, 56, 44);

SELECT AVG(TEMPERATURE)

FROM complexTimeZero

WHERE TD_TIMECODE >= TIMESTAMP'2014-01-01 00:00:00' OR buoyid=1

GROUP BY TIME(MINUTES(10));

TD_TIMECODEの条件に基づいて、タイム ゼロはTIMESTAMP'2014-01-01 00:00:00'と等しくなります。

ただし、OR条件を使用すると、TIMESTAMP '2013-01-06 10:00:24.000000'と等しいTD_TIMECODEを持つ行も集約に含めることができます。タイムコードがタイム ゼロ未満の場合は、タイムコードがタイム ゼロよりも前にあることを示すエラーが返されます。