他のバージョンの文書 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

F.36. seg

本モジュールは線分、浮動小数点区間を表現するsegデータ型を実装します。 segは区間の終端内の不確定性を表すことができ、特に実験計測の表現に有用です。

このモジュールはtrustedと見なされます。つまり、現在のデータベースに対してCREATE権限を持つ非スーパーユーザがインストールできます。

F.36.1. 原理

計測の幾何は数値の連続における点より通常より複雑です。 計測は通常、多少あいまいな制限を持つ連続の部分となります。 不確実性と不規則性のため、さらに、タンパク質を安定させる温度範囲など計測される値は本質的に何らかの状態を示す区間となる可能性があるため、計測は区間として現れます。

一般的な見方を使うと、こうしたデータは値の組合せではなく区間としてデータを格納する方が便利なようです。 実際、ほとんどのアプリケーションでより効率的であると判明してさえいます。

一般的な見方をさらに進めると、制限の曖昧さは、伝統的な数値データ型を使用することで情報がある程度損失してしまうことを暗示しています。 これを考えてみましょう。 計測機器で6.50と読み取り、読み取ったデータをデータベースに格納します。 それを取り出す時にどうなるでしょう。 見てみましょう。

test=> select 6.50 :: float8 as "pH";
 pH
---
6.5
(1 row)

計測という世界では6.50は6.5と同じではありません。 時としてこれが致命的な違いになる場合があります。 実験者は信頼する桁を書き出し(公開し)ます。 6.50は実際には、6.5というより大きくよりあいまいな区間に含まれるあいまいな区間です。 2つに共通するものは(おそらく)その中央の値だけでしょう。 私達は厳密にこうした異なるデータ項目が同じものとして現れることを好みません。

まとめ? 任意の可変精度を持つ区間の制限を記録できる特別なデータ型を持つことは素晴らしいことでしょう。 各データ要素が独自の精度を記録するという意味での可変です。

以下を見てください。

test=> select '6.25 .. 6.50'::seg as "pH";
          pH
------------
6.25 .. 6.50
(1 row)

F.36.2. 構文

区間の外部表現は、1つまたは2つの浮動小数点値を範囲演算子(..または...)で結び付けた形になります。 他にも、中央値と正負の偏差として指定することも可能です。 省略可能な確実性指示子(<>~)を格納することもできます。 (しかし、確実性指示子はすべての組み込みの演算子で無視されます。) 表 F.27に許される表現についての概要を、表 F.28にいくつか例を示します。

表 F.27では、xydeltaは浮動小数点数値を表します。 delta以外のxyの前に確実性指示子を付与することができます。

表F.27 seg外部表現

x単一値(幅0の区間)
x .. yxからyまでの区間
x (+-) deltax - deltaからx + deltaまでの区間
x ..下限値xを持つ閉じていない区間
.. x上限値xを持つ閉じていない区間

表F.28 有効なSEG入力の例

5.0 幅0のセグメントを作成します(こうすると点になります)。
~5.0 幅0のセグメントを作成し、データ内に~を記録します。 ~seg型の演算では無視されますが、コメントとして保持されます。
<5.0 5.0という点を作成します。 <は無視されますが、コメントとして保持されます。
>5.0 5.0という点を作成します。 >は無視されますが、コメントとして保持されます。
5(+-)0.3 4.7 .. 5.3という区間を作成します。 (+-)という記述は保持されないことに注意してください。
50 .. 50以上のすべて
.. 00以下のすべて
1.5e-2 .. 2E-2 0.015 .. 0.02という区間を作成します
1 ... 2 1...21 .. 21..2と同じです(範囲演算子前後の空白は無視されます)。

データソースで...演算子が広く使用されるため、..演算子の代わりの綴りとして許可されています。 残念なことにこれにより解析上の曖昧性が生じました。 0...23の上限が23なのか0.23なのかが明確ではありません。 これは、segの入力において、少なくとも1つの桁を数値内の小数点の前に書くことを要求することで解決されます。

健全性検査としてsegは、5 .. 2のような、下限値が上限値より大きな区間を拒絶します。

F.36.3. 精度

内部的にseg値には32ビット浮動小数点数値の組合せが格納されます。 これは7桁以上の有効桁を持つ数値が切り詰められることを意味します。

有効桁が正確に7桁、または7桁未満の数値は元の精度が保たれます。 つまり、問い合わせが0.00を返す場合、後ろに続く0は書式付けのための見かけのものではないことが確実です。 これは元のデータの精度を反映します。 前にある0の数は精度には影響しません。 0.0067は2有効桁のみを持つものと考えられます。

F.36.4. 使用方法

segモジュールにはseg値用のGiSTインデックス演算子クラスが含まれます。 GiST演算子クラスでサポートされる演算子を表 F.29に示します。

表F.29 Seg GiST演算子

演算子

説明

seg << segboolean

1番目のsegが完全に2番目の左側に存在するか。 b < cならば[a, b] << [c, d]は真です。

seg >> segboolean

1番目のsegが完全に2番目の右側に存在するか。 a > dならば[a, b] >> [c, d]は真です。

seg &< segboolean

1番目のsegは2番目の右側にはみ出さないか。 b <= dならば[a, b] &< [c, d]は真です。

seg &> segboolean

1番目のsegは2番目の左側にはみ出さないか。 a >= cならば[a, b] &> [c, d]は真です。

seg = segboolean

2つのsegは等しいか。

seg && segboolean

2つのsegは重なるか。

seg @> segboolean

1番目のsegは2番目を包含するか。

seg <@ segboolean

1番目のsegは2番目に包含されるか。


上記の演算子に加えて、seg型では表 9.1にある通常の比較演算子が利用可能です。 これらの演算子はまず(a)と(c)を比べ、等しければ(b)と(d)を比べます。 論理的にはほとんどの場合優れたソート処理と思えます。 こうした型をORDER BYで使用したい場合に有用です。

F.36.5. 注釈

使用方法の例はリグレッションテストのsql/seg.sqlを参照してください。

(+-)を通常の範囲に変換する機構は、境界で有効な桁数を決定するという点で完全に正確ではありません。 例えば以下のように、結果の区間に10の冪乗が含まれる場合、下限値に余計な桁を追加します。

postgres=> select '10(+-)1'::seg as seg;
      seg
---------

9.0 .. 11             -- 次のようになるべきです: 9 .. 11

R-treeインデックスの性能は入力値の初期の順序に大きく依存する可能性があります。 seg列で入力テーブルをソートすることは非常に役に立つでしょう。 例としてsort-segments.plスクリプトを参照してください。

F.36.6. クレジット

原作者:Gene Selkov, Jr. , Mathematics and Computer Science Division, Argonne National Laboratory.

GiST (http://gist.cs.berkeley.edu/)の要旨(gist)を説明していただいたJoe Hellerstein博士(https://dsf.berkeley.edu/jmh/)に感謝します。 また、自分の世界を作成できるようにし、静かに生活できるようにしてもらった、過去から現在までのすべてのPostgres開発者に感謝します。 データベース研究を長年誠実にサポートしてくれたArgonne LabとU.S. Department of Energyにも感謝します。