# TQL構文・演算機能

TQLでは、データの取り出し・削除・更新対象の選択のために必要となる、SQLのselect文相当のクエリをサポートします。選択したデータの操作、データ構造管理やトランザクション処理といった、選択操作以外の構文は扱いません。

# 基本構文

すべてのクエリは、次の構文により表現されます。

[EXPLAIN [ANALYZE]] SELECT (選択式) [FROM (コレクション・時系列名)]
[WHERE (条件式)] [ORDER BY (ソート条件)] [LIMIT (数値) [OFFSET (数値)]]

SELECT構文は、FROM節で指定したコレクション・時系列の各ロウについて、WHERE節の条件式に従い絞り込み、その結果を対象カラムや集計方法などが指定された選択式に基づき加工することを要求します。

クエリ実行対象のコレクション・時系列がすでに確定している場合、FROM節を省略するか、対象と同じ名前をFROM節に指定する必要があります。ただし、大文字・小文字は区別されません。WHERE節を省略した場合、対象コレクション・時系列のすべてのロウが選択されます。

SELECT文の前にEXPLAINまたはEXPLAIN ANALYZEを付けた場合、SELECT文に対する実行プラン情報ならびに実行結果の解析情報を求めます。詳細は後述の節を参照してください。

なお、集計演算などを除き、SQLのように特定カラムだけを取り出すことはできません。また、次に相当する節は記述できません。

  • GROUP BY
  • HAVING
  • DISTINCT
  • FOR UPDATE※APIにて指定可能
  • JOIN

これらの基本構文のキーワード、ならびに以降の節で定義する関数や演算子・列挙定数名については、ASCIIコードでの大文字部分を小文字のみで表記することもできます。

# 条件式構文・演算機能

WHERE節で使用される条件式の構文、ならびに、条件式で利用可能な演算子や関数を定義します。 演算子や関数にNULLが含まれる場合は特に記載がないかぎり、NULLを返します。

#

値は、クエリ内で一定のリテラル、または、評価中のロウにおける指定カラムのフィールドのいずれかにより表現します。

# リテラル値

次のいずれかのリテラル値を指定します。

  • 数値型: 10進数による文字列表現で記述します。浮動小数点数の表記はIEEE754に従います。なお、DOUBLE型の非数、正の無限大、負の無限大は、それぞれNAN、INF、-INFと表記します
  • 文字列: シングルクォーテーションで囲んだ文字列を指定します。文字列を構成する文字の一つとしてシングルクォーテーションを表記するためには、シングルクォーテーションを二つ続けて記述します。それ以外の用途でシングルクォーテーションを記述することはできません
  • NULL: NULLと記述します。

# フィールド値

評価中のロウが持つフィールド値を指定するには、対応するカラム名をそのまま記述するか、引用符「"」で囲んだカラム名を記述します。引用符で囲むことにより、「SELECT」や「WHERE」といったキーワードと同名のカラムについても扱うことができます。カラム名についての大文字・小文字表記の違いは区別されません。また、「.」などを用いてコレクション・時系列の名前と組み合わせることはできません。

# 演算子の優先順位

演算子は、次の優先順で評価されます。同順序の演算子同士の場合、記述した順序通りに評価されます。

  1. -(単項)
  2. *, /, %
  3. -(二項), +
  4. =, >=, >, <=, <, <>, LIKE, IS, IS NOT
  5. NOT
  6. AND
  7. OR, XOR

なお、式を「(」...「)」で囲むことで、上の演算子よりも優先して該当する式を評価します。

# 比較演算

# 型の制約

両辺の型の組み合わせは、ブール型同士、文字型同士、数値型同士、時刻型同士のいずれかのみです。数値型については、両辺の精度が異なる場合、より表現範囲の大きい型、もしくはより精度の高い型に変換されます。なお、ブール型同士、文字列型同士の場合、大小比較はできません。

# =, >=, >, <=, <, <>

それぞれ、等価、以上、大なり、以下、小なり、非等価の比較演算結果をブール型で求めます。 ただし、いずれかの値がNULLの場合NULLを返します。 浮動小数点数の比較結果は基本的にはIEEE754に従いますが、NAN(非数)は他の全ての値より大きいと見なし、NAN同士は等しいと評価します。

# IS, IS NOT

左辺の値がNULLと等価、非等価の比較演算結果をブール型で求めます。右辺はNULLでなければなりません。

# 論理演算

# NOT, AND, OR, XOR

それぞれ、否定、論理積、論理和、排他的論理和を示します。演算対象はブール値またはNULLでなければなりません。

# NOT

TRUEならばFALSEを、FALSEならTRUEを、NULLならばNULLを返します。

# AND

両辺がTRUEならばTRUEを、いずれかがFALSEならFALSEを、それ以外はNULLを返します。

# OR

両辺がFALSEならばFALSEを、いずれかがTRUEならTRUEを、それ以外はNULLを返します。

# XOR

両辺がFALSEまたは両辺がTRUEならばFALSEを、いずれかがNULLならNULLを、それ以外はTRUEを返します。

また、AND, ORの演算では短絡評価(または最小評価)を行います。すなわち、先に記述されている式で評価を確定できる場合、後に記述されている式の評価を行いません。 たとえば、

WHERE A=1 AND B=1

の場合、Aが1であれば、B=1を評価しますが、Aが1でない場合、B=1の評価は行いません。

# 文字列演算

# CHAR_LENGTH(str)

文字列の長さを求めます。

# CONCAT(str1, str2, ...)

指定の文字列を順に結合し、1つの文字列を生成します。入力にNULLが含まれる場合はNULLを無視して結合されます

# str LIKE pattern [ESCAPE esc]

検査対象の文字列全体が指定のパターンと一致するかどうかを判定します。判定の際、大文字・小文字を区別します。判定により一致した場合のみ真を返します。

パターン指定では、次のワイルドカード文字を使用できます。

  • %: 0文字以上の任意の文字列と一致
  • _: 1文字の任意の文字と一致

たとえば、次の式は「山田」「田中」「山田太郎」に対して真を返しますが、「小山田」に対しては偽を返します。

column LIKE '_田%'

ワイルドカード文字は、パターン内の任意の位置に任意の回数だけ使用できます。 空文字列のパターンを指定した場合、常に偽を返します。

ワイルドカード文字そのものを検索する場合には、ESCAPE節を使ってエスケープ文字を指定します。 たとえば、以下の式は「10%」に対しては真を返しますが、「10$%」に対しては偽を返します。

column LIKE '10$%' ESCAPE '$'

エスケープ文字の長さは常に1でなければなりません。

検査対象の文字列、パターン、エスケープには、カラム名もしくは文字列リテラルのみを指定できます。

# SUBSTRING(str, start[, length])

部分文字列を求めます。

startには1から始まる文字位置、lengthには取り出す文字列の長さを示す0以上の値を指定します。lengthを省略した場合、指定start位置以降のすべての文字を含めます。start、lengthが範囲外の値を指す場合、空文字列を返します。ただし、startに0以下の値、lengthに0未満の値を指定することはできません。

# UPPER(str), LOWER(str)

文字列中のASCII相当の英字について、それぞれ大文字または小文字に変換します。

# 数値演算

# +, -(単項), -(二項), *, /, %

算術演算を行います。それぞれ、加算、符号反転、減算、乗算、除算、剰余算を表します。ただし、浮動小数点数に対する剰余算は行えません。 浮動小数点数において被除数が0以外の数で除数が0の場合は無限大、被除数と除数が共に0の場合は非数になります。 無限大や非数に関する演算はIEEE754に従います。

# ROUND(num)、FLOOR(num)、CEILING(num)

それぞれ、元の浮動小数点数に関して、小数の桁を四捨五入した整数値、より小きな整数値のうち最大のもの、より大きな整数値のうち最小のものを求めます。結果はDOUBLE型となります。 丸めの方向はそれぞれ、0から遠い方、負の無限大に近い方、正の無限大に近い方になります。 したがってnumが負の値の場合の計算結果は、numの絶対値abs(num)を用いると、-ROUND(abs(num))、-CEILING(abs(num))、-FLOOR(abs(num))と等しくなります。

それぞれの計算例は以下の通りです。

ROUND FLOOR CEILING
1.34 1.0 1.0 2.0
3.67 4.0 3.0 4.0
-0.23 0.0 -1.0 -0.0
-3.89 -4.0 -4.0 -3.0

なお、+0.0、-0.0、整数、非数(NAN)、正負の無限大(INF、-INF)に対してこれらの操作を行っても値は変化しません。

# 時刻型演算

# NOW()

現在時刻(時刻型)を返します。同一のクエリ実行単位内では、常に同一の結果を返します。

例) 時刻型のカラムdateの値が、現在時刻よりも前のデータを検索する

SELECT * WHERE date < NOW()

# TIMESTAMP(str)

時刻の文字列表現を時刻型に変換します。

例えば、時刻型のカラムと、特定の時刻の値を比較する際に利用できます

例) 時刻型のカラムdateの値が、時刻「2018年12月30日 10時15分30秒(UTC)」よりも新しいデータを検索する

SELECT *  WHERE date > TIMESTAMP('2018-12-30T10:15:30.000Z')

時刻の文字列表現としては、西暦での次の形式のみをサポートします。タイムゾーン文字列(Z|±hh:mm|±hhmm)を解釈します。

YYYY-MM-DDThh:mm:ss.SSSZ

「.SSS」の部分は省略できます。 上の形式のうち、英字の部分は10進数表現の整数値で、それぞれ次の意味を示します。

  • YYYY: 年に相当する。最低4桁
  • MM: 月に相当する。常に2桁であり、1から12の範囲で指定する
  • DD: 日に相当する。常に2桁であり、1から31の範囲で指定する。存在しない日を指定した場合、受け付けない。年や月によって異なる
  • hh: 24時間表記での時間に相当する。常に2桁であり、0から23の範囲で指定する
  • mm: 分に相当する。常に2桁であり、0から59の範囲で指定する
  • ss: 秒に相当する。常に2桁であり、0から59の範囲で指定する
  • SSS: ミリ秒に相当する。常に3桁であり、0から999の範囲で指定する

表現範囲については付録の値の範囲を参照してください。

# TIMESTAMPADD(time_unit, timestamp, duration)

指定の時刻に対し、指定した単位の特定の期間を加算します。期間には数値型の値を指定します。負の値の期間を指定した場合は、元の時刻より過去の時刻が求まります。現バージョンでは、算出の際に使用されるタイムゾーンはUTCです。

第一引数time_unitには、次のいずれかの識別子を指定します。

  • YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | MILLISECOND

例) 時刻型のカラムdateの値が、現在時刻から1時間前の時刻よりも前のデータを検索する

SELECT * WHERE date < TIMESTAMPADD(HOUR, NOW(), -1)

# TIMESTAMPDIFF(time_unit, timestamp1, timestamp2)

2つの時刻の差について、指定した単位で結果を求めます。結果は数値型の値となります。現バージョンでは、算出の際に使用されるタイムゾーンはUTCです。

第一引数time_unitには、次のいずれかの識別子を指定します。

  • YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | MILLISECOND

例) 時刻型のカラムexpiredとissuedの差(=expired-issued)が3日以上のデータを検索する

SELECT * WHERE TIMESTAMPDIFF(DAY, expired, issued) >= 3

例) 時刻型のカラムendとstartの差(=end-start)が10時間未満のデータを検索する

SELECT * WHERE TIMESTAMPDIFF(HOUR, end, start) < 10

# TO_TIMESTAMP_MS(num)

時刻1970-01-01T00:00:00Zのnumミリ秒後に対応するTIMESTAMPへ変換します。numが浮動小数点数型の値の場合、エラーになります。また、負の値や極端に大きな値など、変換結果が時刻型で表せない場合はエラーになります。そのため、数値型カラムに対して本関数を用いたクエリを発行した場合、カラムの値に変換結果が時刻型で表せない値が含まれているとエラーになります。例えば、以下のクエリはnum=-1となるロウがコンテナ内にある場合エラーになります。

SELECT * WHERE TO_TIMESTAMP_MS(num) > TIMESTAMP('2011-01-01T00:00:00Z')

このような場合はTO_EPOCH_MS関数を用いて以下のようにして、数値型の値を変換した結果が時刻型の範囲となる値だけを評価するようにして回避してください。

SELECT * WHERE num < TO_EPOCH_MS(TIMESTAMP('9999-12-31T23:59:59.999Z'))
               AND num >= 0
               AND TO_TIMESTAMP_MS(num) > TIMESTAMP('2011-01-01T00:00:00Z')

# TO_EPOCH_MS(timestamp)

timestampで指定した時刻型の値について、時刻1970-01-01T00:00:00Zからのミリ秒単位での経過時間を示すLONG型の値へ変換します。時刻型でない値が指定された場合はエラーになります。この関数はTO_TIMESTAMP_MS関数の逆変換です。

例) 1970-01-01T00:00:00Zからの経過時間のカラム値numと現時刻を比較する

SELECT * WHERE num > TO_EPOCH_MS(NOW())

# 配列型演算

# ARRAY_LENGTH(array)

配列の長さを求めます。

# ELEMENT(n, array)

特定位置の配列要素を取り出します。長さ1以上の配列でなければなりません。 nには0から始まる要素位置を整数で指定します。 nが浮動小数点数や負の値の場合、nがarrayの長さより長い場合、またarrayの長さが0の場合はエラーになります。 そのため、コレクションに長さが異なる配列が格納されている場合、 以下のような配列要素を指定したクエリは配列要素が取得できない場合にエラーになる可能性があります。

SELECT * FROM arrays WHERE ELEMENT(1, array) = 1

このようなクエリは、以下のようにしてELEMENT関数が評価されるのを回避してください。

SELECT * FROM arrays WHERE ARRAY_LENGTH(array)>= 1 AND ELEMENT(1, array) = 1

# 空間型演算

空間型データは、OpenGISなどGISの分野で広く用いられています。 TQLでは、2次元もしくは3次元の空間構造を扱い、生成関数ならびに判定関数を提供します。

# ST_GeomFromText(text)

WKT表現の文字列から空間型データを生成します。

WKTとは、空間構造を文字列として表現するための規格です。 このうちTQLでは、次の構造のみをサポートします。

  • POINT: 2次元または3次元座標により表現される点
  • LINESTRING: 2つ以上の点により表現される、2次元または3次元空間上の直線の集合
  • POLYGON: 直線の集合により表現される、2次元または3次元空間上の閉じた領域
  • POLYHEDRALSURFACE: 指定した領域の集合により表現される、3次元空間上の領域
  • QUADRATICSURFACE: 定義式f(X) = <AX, X> + BX + cにより表現される、3次元空間上の2次曲面

ただし、座標を構成する数値として無限大もしくは非数を含めることはできません。 そのほか、サポート外の空間構造を与えることはできません。

2次元空間上の点(0, 0)、(10, 10)を対角線とする矩形の場合、次のように表記します。

POLYGON((0 0,10 0,10 10,0 10,0 0))

また、各種別の空間構造データ型について、空ジオメトリと呼ばれる、特定の空間範囲と対応しない値を表現できます。次の例のように、座標値の代わりに「EMPTY」と記述します。

LINESTRING(EMPTY)

また、「;」の後ろに整数を記述することにより、SRIDを指定できます。 次の例では、矩形がSRID:4326の座標系にあることを示します。

POLYGON((0 0,10 0,10 10,0 10,0 0);4326)

ただし、このSRIDの表す座標系による座標の範囲制限や、SRIDの変更による座標変換には対応していません。 SRIDを指定しない場合、無効なSRIDとして-1が設定されます。

# ST_MakeRect(p1, p2)

2次元空間の点p1、p2を対角線とする矩形を生成します。p1, p2が同一の点の場合、またはp1, p2のx座標、y座標のいずれかが等しい場合は矩形を形成できないためエラーになります。

# ST_MakeRect(x1, y1, x2, y2)

2次元空間の点(x1, y1)、(x2, y2)を対角線とする矩形を生成します。x1がx2と等しい場合、もしくはy1がy2と等しい場合は矩形を形成できないためエラーになります。

# ST_MakeBox(p1, p2)

3次元空間の点p1、p2を対角線とする直方体を生成します。 p1, p2が同一の点の場合、またはp1, p2のx座標、y座標、z座標のいずれかが等しい場合は直方体を形成できないためエラーになります。

# ST_MakeBox(x1, y1, z1, x2, y2, z2)

3次元空間の点(x1, y1, z1)、(x2, y2, z2)を対角線とする直方体を生成します。 x1がx2と等しい場合、y1がy2と等しい場合、z1がz2と等しい場合は直方体を形成できないためエラーになります。

# ST_MakePlane(p0x, p0y, p0z, vx, vy, vz)

3次元空間の点p0、法線ベクトルvから平面を作成します。 vの長さが0の場合、未定義の平面を作成します。この未定義の平面はどのような空間構造とも交差しません。

# ST_MakeCone(p0x, p0y, p0z, vx, vy, vz, deg)

3次元空間の点p0、軸のベクトルv、軸と母線の角度degから円錐を作成します。 角度degの単位は度です。vの長さが0の場合、エラーになります。 degが0~90の範囲にない場合でも、degの360で割った余りを用いて、軸の逆ベクトルを考慮して円錐を作成します。

# ST_MakeSphere(p0x, p0y, p0z, r)

3次元空間の点p0と半径rから球を生成します。 rが0または負の値の場合、エラーになります。

# ST_MakeCylinder(p0x, p0y, p0z, vx, vy, vz, r)

3次元空間の点p0、軸のベクトルv、半径rから円柱を生成します。 vの長さが0の場合はエラーになります。 rが0の場合は直線になります。rが負の値の場合は、-rを指定した場合と同一です。

# ST_MakeQSF(A00, A01, A02, A10, A11, A12, A20, A21, A22, B0, B1, B2, c)

定義式f(X) = <AX, X> + BX + cで表現される、3次元空間上の2次曲面を生成します。 定義式が2次曲面として成立しているかどうかは判定しません。

# ST_MBRIntersects(g1, g2)

双方の空間範囲の外接直方体(Minimum Bounding Box)が交差するかどうかを判定します。 交差する場合のみ、真を返します。 「交差する」とは「2つの領域に共通する領域がある」ことを意味します。

g1、g2のいずれについても、2次曲面(QUADRATICSURFACE)は指定できません。 また、POLYHEDRALSURFACEについて、直方体以外の形状、互いに辺を共有しないPOLYGONの組み合わせ、もしくは空間構造として閉じていない形状を指定した場合、結果は未定義となります。

一方がx、y座標からなる2次元空間構造、他方がx、y、z座標からなる3次元空間構造の場合、z座標を除いたx、y座標のみを判定対象とします。 たとえば、POINT(x0 y0)とLINESTRING(x1 y1 z1, x2 y2 z2)についての交差判定の結果は、x1 <= x0 <= x2かつy1 <= y0 <= y2が成立する場合のみ真となります。

一方または双方が空ジオメトリの場合、偽を返します。

外接直方体は、構造の種類に応じて以下のように定義されます。

  • POINT: 全ての頂点が同一であり、各辺の長さが0の直方体。構造が2次元の場合、直方体のz座標の範囲は(-∞,∞)として扱います。
  • LINESTRING、POLYGON、POLYHEDRALSURFACE: 構造を構成する点のx、y、z座標の最小値と最大値で構成される直方体。構造が2次元の場合、直方体のz座標の範囲は(-∞,∞)として扱います。

例) カラムgeom上の空間型データと指定の矩形範囲とが交差するようなロウを選択する

SELECT * WHERE ST_MBRIntersects(geom, ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0))'))

# ST_QSFMBRIntersects(q, g)

2次曲面qと、2次曲面以外の空間構造gの外接直方体とが交差するかどうかを判定します。交差する場合のみ、真を返します。 qに2次曲面以外、gに2次曲面を与えることはできません。 また、gに2次元空間構造を与えることはできません。 そのほかの交差判定の条件は、ST_MBRIntersectsと同様です。

# ST_GetSrId(g)

空間構造gのSRIDを取得します。gがSRIDを持たない場合、無効なSRID (-1)が返ります。

# 選択式

# 基本構文

対象カラムや集計方法などを記述する、選択式の構文を定義します。処理対象となるロウは、FROM節、WHERE節の条件に合致したものに限定されます。

# *(アスタリスク)

条件に合致したすべてのロウをそのまま選択します。ORDER BY節(後述)を指定することでカラムの値によって並べ替えることができます。

# (演算関数)

後述の演算関数のうちいずれか1つの関数により、集計・選択などの演算を行います。

演算の内部処理にてオーバーフローが発生した場合、浮動小数点数型では負または正の無限大、整数型では未定義の値が求まります。また、浮動小数点数型にて演算対象に非数(NAN)が含まれていた場合、非数が求まります。

# 集計演算 ― 一般

任意のロウ集合に対して、集計演算を行います。

集計対象となるロウが1つも存在しない場合、COUNT関数を除き結果件数は0件となります。それ以外の場合、結果件数は1件となります。 集計演算では特に記載がないかぎり、指定したカラムの値がNULLの場合は評価対象から外れます。

# MAX(column)

指定カラムの値の最大値を求めます。数値型または時刻型のカラムのみ指定できます。演算結果の型は、指定カラムと同一の型となります。

# MIN(column)

指定カラムの値の最小値を求めます。数値型または時刻型のカラムのみ指定できます。演算結果の型は、指定カラムと同一の型となります。

# COUNT(*)

集計対象のロウの個数を求めます。カラムは指定できません。演算結果の型は常にLONGとなります。対象となるロウが1つも存在しない場合、演算結果の値は0となります。 COUNT(*)はNULLを含むロウも評価対象になります。

# SUM(column)

指定のカラムの値の合計値を求めます。数値型のカラムのみ指定できます。演算結果の型は、対象のカラムが整数型の場合はLONG、浮動小数点型の場合はDOUBLEとなります。

# AVG(column)

指定のカラムの値の平均を求めます。数値型のカラムのみ指定できます。演算結果の型は常にDOUBLEとなります。

# VARIANCE(column)

指定のカラムの値の分散値を求めます。数値型のカラムのみ指定できます。演算結果の型は常にDOUBLEとなります。

# STDDEV(column)

指定のカラムの値の標準偏差を求めます。数値型のカラムのみ指定できます。演算結果の型は常にDOUBLEとなります。

# 集計演算 ― 時系列

時系列のロウ集合に対して、集計演算を行います。

ロウの時刻に基づき重み付けを行う集計演算では、条件に合致した各ロウについて、前後それぞれの時刻のロウとの中間時刻間の期間を特定の単位で換算したものを、重み付け値として使用します。ただし、前後いずれかの時刻のロウのみが存在しない場合は、存在しないロウの代わりに重み付け対象のロウを用いて求めた重み付け値を使用します。前後いずれの時刻のロウも存在しない場合は、重み付け値として1(単位は前後いずれかのロウが存在する場合と同一)を使用します。 集計演算では特に記載がないかぎり、指定したカラムの値がNULLの場合は評価対象から外れます。

# TIME_AVG(column)

指定のカラムの値について、ロウの時刻に基づく重み付き平均を求めます。演算結果の型は常にDOUBLEとなります。

各標本値と重み付け値との積の合計を、各重み付け値の合計で割ることにより求めます。数値型のカラムのみ指定できます。重み付け値の計算方法は、前節の通りです。

例) プラント1、ポイント103における、2011年7月の平均電圧について、時刻による重み付きで求める

SELECT TIME_AVG(voltage103) FROM plant1
  WHERE TIMESTAMP('2011-07-01T00:00:00Z') <= timestamp AND timestamp < TIMESTAMP('2011-08-01T00:00:00Z')

ここで、次のような時系列の場合の、重み付き平均値の計算手順の一例を紹介します。

キー(2011年7月1日0時0分の秒の位) 集計対象カラム
0秒 4
10秒 3
20秒 2
40秒 1

この時系列を次の表のように拡張し、左の列から順に、前後時刻のロウとの中間時刻、重み付け値、標本値(カラムの値)と重みとの積を順に求めます。

キー 集計対象カラム 中間時刻(秒の位) 中間時刻(前)との差 中間時刻(後)との差 重み付け値 標本値と重みとの積
0秒 4 - - 5 (=5-0) 5 20 (=4*5)
(中間) - 5秒(=(0+10)/2) - - - -
10秒 3 - 5 (=10-5) 5 (=15-10) 10 (=5+5) 30 (=3*10)
(中間) - 15秒(=(10+20)/2) - - - -
20秒 2 - 5 (=20-15) 10 (=30-20) 15 (=5+10) 30 (=2*15)
(中間) - 30秒(=(20+40)/2) - - - -
40秒 1 - 10 (=40-30) - 10 10 (=1*10)

最後に、標本値と重みとの積、重み付け値をそれぞれ合計し、商を求めます。この時系列の場合、(20+30+30+10)/(5+10+15+10)=90/40=2.25となります。以上の手順は、必ずしもGridDB内部の演算手順と同一であるとは限りません。

なお、通常の重みなし平均値の場合、(4+3+2+1)/4=10/4=2.5となります。

# 時系列データ選択・補間演算

# TIME_NEXT(*, timestamp)

指定の時刻と同一またはその直後の時刻を持つ1つの時系列ロウを選択します。

例) プラント1における、2011年7月初めの時点の温度を求める

SELECT TIME_NEXT(*, TIMESTAMP('2011-07-01T00:00:00Z')) FROM plant1

# TIME_NEXT_ONLY(*, timestamp)

指定の時刻の直後の時刻を持つ1つの時系列ロウを選択します。

# TIME_PREV(*, timestamp)

指定の時刻と同一またはその直前の時刻を持つ1つの時系列ロウを選択します。

# TIME_PREV_ONLY(*, timestamp)

指定の時刻の直前の時刻を持つ1つの時系列ロウを選択します。

# TIME_INTERPOLATED(column, timestamp)

指定の時刻に関して、一致する時系列ロウの指定のカラムの値、もしくは、前後時刻のロウの指定カラムの値を線形補間して得られた値を求めます。前後時刻のロウの指定カラムのいずれか一方がNULLの場合はNULLが設定されます。 前後時刻のロウの少なくともいずれか、もしくは、一致するロウが存在しない場合、目的のロウは生成されず、結果件数は0件となります。数値型のカラムのみ指定できます。指定のカラムならびにキー以外のフィールドには、指定時刻と同一またはより前の時刻のロウのうち、最も新しい時刻を持つロウのフィールドの値が設定されます。

# TIME_SAMPLING(*|column, timestamp_start, timestamp_end, interval, DAY|HOUR|MINUTE|SECOND|MILLISECOND)

開始・終了時刻を指定して、特定範囲のロウ集合をサンプリングします。

サンプリング位置の時刻は、開始時刻に対し非負整数倍のサンプリング間隔を加えた時刻のうち、終了時刻と同じかそれ以前のもののみです。

各サンプリング位置の時刻と一致するロウが存在する場合は該当ロウの値を使用します。存在しない場合は補間された値を使用します。補間対象のロウフィールドのうち指定のカラムのものは、サンプリング時刻の前後時刻のロウの値より線形補間して求めた値を使用します。前後時刻のロウの指定カラムのいずれか一方がNULLの場合はNULLが設定されます。それ以外のフィールドには、対象地点の時刻より前の時刻のロウのうち、最も新しい時刻を持つロウの値を補間値として使用します。線形補間対象のカラムの型は、すべて数値型でなければなりません。カラムを具体的に指定せず、「*」を指定した場合、すべてのフィールドについて後者の補間方法により値を求めます。

補間のために参照する必要のあるロウが存在しない場合、該当するサンプリング時刻のロウは生成されず、該当箇所の数だけ結果件数が減少します。サンプリング間隔をより短く設定すると、線形補間対象外のカラムについては、異なるサンプリング時刻であっても同一のロウの内容が使用される可能性が高まります。サンプリング間隔に対応する引数intervalには正の値のみ指定できます。

例) プラント1、ポイント103における、2011年7月1日の毎時ごとの電圧を求める

SELECT TIME_SAMPLING(
  voltage103, TIMESTAMP('2011-07-01T00:00:00Z'), TIMESTAMP('2011-07-02T00:00:00Z'), 1, HOUR)
FROM plant1

また、このサンプリング結果についてORDER BY節(後述)を記述してカラム順に並べ替えることができます。 例) プラント1、ポイント103における、2011年7月1日の毎時ごとの電圧を求め、電圧順に並び替える

SELECT TIME_SAMPLING(
  voltage103, TIMESTAMP('2011-07-01T00:00:00Z'), TIMESTAMP('2011-07-02T00:00:00Z'), 1, HOUR)
FROM plant1 ORDER BY voltage103

# 最大値・最小値のロウ集合選択演算

任意のロウ集合に対して、指定カラムの値で最大値もしくは最小値をもつロウ集合を返します。 集計演算では特に記載がないかぎり、指定したカラムの値がNULLの場合は評価対象から外れます。

# MAX_ROWS(column)

指定カラムの値で最大値をもつロウ集合を求めます。数値型または時刻型のカラムのみ指定できます。

# MIN_ROWS(column)

指定カラムの値で最小値をもつロウ集合を求めます。数値型または時刻型のカラムのみ指定できます。

# 検索結果の並び替え(ORDER BY)

ORDER BY節を記述することで、検索結果の並び替えの順序を指定することができます。 ORDER BY節の記述は以下のように定義されます。

ORDER BY (カラム名) [ASC|DESC] [, (カラム名) [ASC|DESC]]*

ただし、'*'は前要素の0回以上の繰り返しとします。

ASCは昇順指定を表しており、DESCは降順指定を表します。指定を省略すると昇順を指定したものとみなします。 複数ソート条件が記述された場合、先頭の条件から順に優先されます。 NULLは最も大きな値としてソートされます。

例) aの降順を第一ソート条件、bの昇順を第二ソート条件, cの昇順を第三ソート条件として検索する

SELECT * ORDER BY a DESC, b ASC, c

SQLとは異なり、ソート条件に計算式や関数を指定することはできません。

# 検索結果の取得件数、相対位置指定(LIMIT, OFFSET)

LIMIT節を記述することで、検索結果の取得個数を制限できます。 また、OFFSETを指定することで、検索結果の取得の開始位置を指定できます。 LIMIT, OFFSET指定の文法は以下の通り定義されます。

LIMIT (数値) [OFFSET (数値)]

OFFSETは必ずLIMITと共に使用されます。省略するとOFFSET 0と同義です。 LIMIT, OFFSETの数値に負の値や浮動小数点数を指定することはできません。

LIMIT, OFFSETの数値に計算式や関数を指定することはできません。

# 実行プラン情報の取得・実行結果の解析

SELECT文の前にEXPLAINまたはEXPLAIN ANALYZEを付けることで、実行プラン情報ならびに実行結果の解析情報が求まります。

取得結果は、ロウと同様の構造からなる、次のエントリの列により構成されます。

名称 説明
ID INTEGER型 一連のエントリ列における、このエントリの位置を示すIDです。
DEPTH INTEGER型 他のエントリとの関係を表すための、深さを表します。このエントリより小さな値のIDを順にたどり、このエントリの深さより1だけ浅いエントリが存在した場合、このエントリは、該当するエントリの内容をより詳しく説明するためのものであることを意味します。
TYPE 文字列型 このエントリが示す情報の種別を表します。実行時間といった解析結果の種別、クエリプランの構成要素の種別などを表します。
VALUE_TYPE 文字列型 このエントリが示す情報に対応付けられた値の型を表します。実行時間といった解析結果などに対応する値の型を返します。型の名称は、TQLで定義された基本型のものと同一です。値が対応づけられていない場合は空文字列が設定されます。
VALUE 文字列型 このエントリが示す情報に対応付けられた値の文字列表現を表します。値が対応づけられていない場合は空文字列が設定されます。
STATEMENT 文字列型 このエントリが示す情報に対応するTQL文の一部を返します。対応関係を持たない場合は空文字列が設定されます。

# EXPLAIN

後続のSELECT文に関する実行プラン情報を求めます。SELECT文自体は実行しません。

同一のクエリ文であっても、索引設定などにより結果が異なる場合があります。

# EXPLAIN ANALYZE

後続のSELECT文に関する実行プラン情報を取得するとともに、SELECT文を実行し、実行時間などの解析情報を求めます。