すべてのGROUP BY TIME操作には、タイム ゼロの値が関連付けられています。
SELECT … WHERE TD_TIMECODE BETWEEN a and baがタイム ゼロの値です。
時系列クエリーに複数の時間範囲が(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)に設定されます。
次のルールは、タイム ゼロの計算方法について説明しています。
ルール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の範囲に変換可能でなければならない
- 複数の範囲を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: 開始点は負の無限大で、終了点は正の無限大である
- 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を持つ行も集約に含めることができます。タイムコードがタイム ゼロ未満の場合は、タイムコードがタイム ゼロよりも前にあることを示すエラーが返されます。