Skip to content
Last updated

0.189から0.205の間に追加されたPrestoの関数と機能(2018年)

v0.189

ラムダ式における行フィールドの参照解決のサポートを追加

テーブルエイリアスを使用する以下のラムダ関数がサポートされます。

select transform(array[1], x -> x + t.a) from (values 1, 2, 3) t(a);
=>
["2"]
["3"]
["4"]

v0.190

集約関数におけるORDER BYのサポートを追加

array_agg()などの一部の集約関数は、入力値の順序に応じて異なる結果を生成します。この順序は、集約関数内にORDER BY句を記述することで指定できます:

array_agg(x ORDER BY y DESC)
array_agg(x ORDER BY x, y, z)

INTERVAL型へのキャストのサポートを追加

INTERVAL型に対する集約の最適化

SELECT CAST(INTERVAL '18000' SECOND AS VARCHAR);
=>0 05:00:00.000

ST_Buffer()地理空間関数を追加

指定されたジオメトリからの距離が指定された距離以下であるすべての点を表すジオメトリを返します。

    SELECT ST_BUFFER(ST_Point(1, 2), 2.0)
    => POLYGON ((3 2, 2.9957178464772056 2.130806258460286, 2.982889722747619 2.2610523844401027, 2.9615705608064595 2.390180644032256, 2.9318516525781355 2.517638090205041, 2.8938602589902103 2.6428789306063227, 2.8477590650225726 2.765366864730179, 2.7937454830653756 2.8845773804380017, 2.7320508075688767 2.999999999999999, 2.66293922460509 3.1111404660392035, 2.58670668058247 3.217522858017441, 2.5036796149579543 3.318691630200137, 2.414213562373095 3.4142135623730945, 2.3186916302001377 3.5036796149579543, 2.217522858017441 3.58670668058247, 2.1111404660392044 3.66293922460509, 2 3.7320508075688767, 1.8845773804380026 3.7937454830653765, 1.7653668647301795 3.847759065022573, 1.6428789306063232 3.893860258990211, 1.5176380902050415 3.9318516525781364, 1.3901806440322564 3.961570560806461, 1.2610523844401031 3.982889722747621, 1.130806258460286 3.995717846477207, 1 4, 0.8691937415397142 3.9957178464772056, 0.7389476155598972 3.982889722747619, 0.6098193559677438 3.9615705608064595, 0.48236190979495897 3.9318516525781355, 0.3571210693936774 3.8938602589902103, 0.2346331352698211 3.8477590650225726, 0.11542261956199817 3.7937454830653756, 7.7715611723760960e-16 3.7320508075688767, -0.11114046603920369 3.66293922460509, -0.21752285801744065 3.58670668058247, -0.318691630200137 3.5036796149579543, -0.4142135623730945 3.414213562373095, -0.5036796149579543 3.3186916302001377, -0.5867066805824699 3.217522858017441, -0.66293922460509 3.1111404660392044, -0.732050807568877 3, -0.7937454830653763 2.8845773804380026, -0.8477590650225733 2.7653668647301792, -0.8938602589902112 2.642878930606323, -0.9318516525781366 2.5176380902050415, -0.9615705608064609 2.3901806440322564, -0.9828897227476208 2.261052384440103, -0.995717846477207 2.1308062584602863, -1 2, -0.9957178464772056 1.8691937415397142, -0.9828897227476194 1.7389476155598973, -0.9615705608064595 1.6098193559677438, -0.9318516525781353 1.482361909794959, -0.8938602589902103 1.3571210693936773, -0.8477590650225726 1.2346331352698212, -0.7937454830653756 1.1154226195619983, -0.7320508075688765 1.0000000000000009, -0.6629392246050898 0.8888595339607963, -0.5867066805824699 0.7824771419825594, -0.5036796149579543 0.681308369799863, -0.4142135623730947 0.5857864376269055, -0.31869163020013747 0.4963203850420457, -0.2175228580174411 0.4132933194175301, -0.11114046603920436 0.33706077539491, 1.1102230246251565e-16 0.26794919243112303, 0.11542261956199751 0.2062545169346237, 0.23463313526982055 0.15224093497742675, 0.35712106939367694 0.10613974100978885, 0.4823619097949585 0.06814834742186338, 0.6098193559677435 0.03842943919353914, 0.7389476155598969 0.017110277252379236, 0.8691937415397138 0.004282153522793042, 1 0, 1.1308062584602858 0.004282153522794374, 1.2610523844401027 0.017110277252380568, 1.3901806440322562 0.03842943919354047, 1.517638090205041 0.06814834742186471, 1.6428789306063227 0.10613974100978973, 1.7653668647301788 0.1522409349774274, 1.8845773804380017 0.20625451693462438, 1.9999999999999991 0.2679491924311235, 2.1111404660392035 0.3370607753949102, 2.217522858017441 0.4132933194175301, 2.318691630200137 0.4963203850420457, 2.4142135623730945 0.5857864376269053, 2.5036796149579543 0.6813083697998625, 2.58670668058247 0.7824771419825589, 2.66293922460509 0.8888595339607956, 2.7320508075688767 1, 2.7937454830653765 1.1154226195619974, 2.847759065022573 1.2346331352698205, 2.893860258990211 1.3571210693936768, 2.9318516525781364 1.4823619097949585, 2.961570560806461 1.6098193559677436, 2.982889722747621 1.7389476155598969, 2.995717846477207 1.869193741539714, 3 2))

approx_distinct()関数が[0.0040625, 0.26000]の範囲の標準誤差をサポート

個別の入力値の概算数を返します。この関数はcount(DISTINCT x)の近似値を提供します。すべての入力値がnullの場合、ゼロが返されます。

この関数はe以下の標準誤差を生成する必要があります。eは、すべての可能なセットに対する(ほぼ正規の)誤差分布の標準偏差です。特定の入力セットに対する誤差の上限を保証するものではありません。この関数の現在の実装では、e[0.0040625, 0.26000]の範囲内である必要があります。

SELECT APPROX_DISTINCT(x, value) from tbl;

v0.193

map_zip_with()ラムダ関数を追加

functionを同じキーを持つ値のペアに適用することで、2つの指定されたマップを単一のマップにマージします。1つのマップにのみ存在するキーの場合、欠落しているキーの値としてNULLが渡されます。

    map_zip_with(map<K, V1>, map<K, V2>, function<K, V1, V2, V3>) → map<K, V3>
    SELECT map_zip_with(MAP(ARRAY[1, 2, 3], ARRAY['a', 'b', 'c']), -- {1 -> ad, 2 -> be, 3 -> cf}
                        MAP(ARRAY[1, 2, 3], ARRAY['d', 'e', 'f']),
                        (k, v1, v2) -> concat(v1, v2));

    SELECT map_zip_with(MAP(ARRAY['k1', 'k2'], ARRAY[1, 2]), -- {k1 -> ROW(1, null), k2 -> ROW(2, 4), k3 -> ROW(null, 9)}
                        MAP(ARRAY['k2', 'k3'], ARRAY[4, 9]),
                        (k, v1, v2) -> (v1, v2));

    SELECT map_zip_with(MAP(ARRAY['a', 'b', 'c'], ARRAY[1, 8, 27]), -- {a -> a1, b -> b4, c -> c9}
                        MAP(ARRAY['a', 'b', 'c'], ARRAY[1, 2, 3]),
                        (k, v1, v2) -> k || CAST(v1/v2 AS VARCHAR));

normal_cdf()関数を追加

正規分布の累積分布関数の値を返します。

    Normal_cdf(mean, standard deviation, value) → double

v0.196

is_json_scalar() 関数の追加

json がスカラー(つまり、JSON数値、JSON文字列、truefalse、または null)であるかどうかを判定します:

    SELECT is_json_scalar('1');
    => true

    SELECT is_json_scalar('[1, 2, 3]');
    => false

各��換にラムダを実行する regexp_replace() 関数のバリアントを追加

string 内の正規表現 pattern にマッチする部分文字列のすべてのインスタンスを replacement に置き換えます。キャプチャグループは、番号付きグループの場合は $g、名前付きグループの場合は ${name} を使用して replacement で参照できます。ドル記号($)は、バックスラッシュ(\$)でエスケープすることで置換に含めることができます:

    SELECT regexp_replace('1a 2b 14m', '(\d+)([ab]) ', '3c$2 ');
    => '3ca 3cb 14m'

v0.197 および v0.198

暗黙的な1日刻みのステップインクリメントを持つ sequence() 関数の DATE バリアントを追加

start から stop までの整数のシーケンスを生成します。startstop 以下の場合は 1 ずつインクリメントし、それ以外の場合は -1 ずつインクリメントします。

v0.197

ST_IsSimple() 地理空間関数の追加

    SELECT ST_IsSimple(ST_GeomFromText('POLYGON((1 2, 3 4, 5 6, 1 2))'));
    st_issimple
    -------------
    t
    (1 row)

    SELECT ST_IsSimple(ST_GeomFromText('LINESTRING(1 1,2 2,2 3.5,1 3,1 2,2 1)'));
    st_issimple
    -------------
    f
    (1 row)

v0.199

hmac_md5()、hmac_sha1()、hmac_sha256()、および hmac_sha512() 関数の追加

指定された key を使用して、binary の md5、sha1、sha256、または sha512 で HMAC を計算します

    hmac_md5(binary, key) → varbinaryComputes

    hmac_sha1(binary, key) → varbinaryComputes

    hmac_sha256(binary, key) → varbinaryComputes

    hmac_sha512(binary, key) → varbinaryComputes

コンパレータとしてラムダを受け取る array_sort() 関数の追加

指定されたコンパレータ function に基づいて array をソートして返します。コンパレータは、array の2つのnull許容要素を表す2つのnull許容引数を受け取ります。最初のnull許容要素が2番目のnull許容要素より小さい場合は-1、等しい場合は0、大きい場合は1を返します。コンパレータ関数が他の値(NULL を含む)を返す場合、クエリは失敗してエラーが発生します

    SELECT array_sort(ARRAY [3, 2, 5, 1, 2], (x, y) -> IF(x < y, 1, IF(x = y, 0, -1))); -- [5, 3, 2, 2, 1]
    SELECT array_sort(ARRAY ['bc', 'ab', 'dc'], (x, y) -> IF(x < y, 1, IF(x = y, 0, -1))); -- ['dc', 'bc', 'ab']
    SELECT array_sort(ARRAY [3, 2, null, 5, null, 1, 2], -- null を最初にして降順でソート
                     (x, y) -> CASE WHEN x IS NULL THEN -1
                                    WHEN y IS NULL THEN 1
                                    WHEN x < y THEN 1
                                    WHEN x = y THEN 0
                                    ELSE -1 END); -- [null, null, 5, 3, 2, 2, 1]
    SELECT array_sort(ARRAY [3, 2, null, 5, null, 1, 2], -- null を最後にして降順でソート
                     (x, y) -> CASE WHEN x IS NULL THEN 1
                                    WHEN y IS NULL THEN -1
                                    WHEN x < y THEN 1
                                    WHEN x = y THEN 0
                                    ELSE -1 END); -- [5, 3, 2, 2, 1, null, null]
    SELECT array_sort(ARRAY ['a', 'abcd', 'abc'], -- 文字列の長さでソート
                      (x, y) -> IF(length(x) < length(y),
                                -1,
                                  IF(length(x) = length(y), 0, 1))); -- ['a', 'abc', 'abcd']
    SELECT array_sort(ARRAY [ARRAY[2, 3, 1], ARRAY[4, 2, 1, 4], ARRAY[1, 2]], -- 配列の長さでソート
                      (x, y) -> IF(cardinality(x) < cardinality(y),
                                 -1,
                                   IF(cardinality(x) = cardinality(y), 0, 1))); -- [[1, 2], [2, 3, 1], [4, 2, 1, 4]]

line_locate_point() 地理空間関数の追加

指定された Point に最も近い LineString 上の点の位置を、2次元ラインの総長に対する割合として、0から1の間のfloatで返します。

LineString または Point が空または null の場合は null を返します。

    SELECT LINE_LOCATE_POINT(GEOMFROMTEXT('LINESTRING(0 0, 5 5, 10 10)'), GEOMFROMTEXT('POINT(5 5)'));

    -------------
    col1
    -------------
    0.500
    -------------

v0.200

ST_GeometryType() 地理空間関数の追加

ジオメトリのタイプを返します。

    SELECT ST_GeometryType(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));

    => ST_LineString

v0.202

multimap_from_entries() 関数の追加

指定されたエントリの配列から作成されたマップを返します。

    SELECT multimap_from_entries(ARRAY[(1, 'x'), (2, 'y'), (1, 'z')]); -- {1 -> ['x', 'z'], 2 -> ['y']}

bing_tiles_around() 地理空間関数の追加

指定されたズームレベルで、緯度と経度の引数で指定されたポイントを囲むBingタイルのコレクションを返します。

 bing_tiles_around(latitude, longitude, zoom_level) → array<BingTile>

ST_NumGeometries() 地理空間関数の追加

コレクション内のジオメトリの数を返します。ジオメトリがジオメトリのコレクション(例: GEOMETRYCOLLECTION または MULTI*)の場合はジオメトリの数を返し、単一のジオメトリの場合は1を返し、空のジオメトリの場合は0を返します。

    ST_NumGeometries(Geometry) → bigint
    SELECT ST_NumGeometries(ST_GeomFromEWKT('GEOMETRYCOLLECTION(MULTIPOINT(-2 3 , -2 2),
    LINESTRING(5 5 ,10 10),
    POLYGON((-7 4.2,-7.1 5,-7.1 4.3,-7 4.2)))'));

ST_GeometryN() 地理空間関数の追加

指定されたインデックス(インデックスは1から始まります)のジオメトリ要素を返します。ジオメトリがジオメトリのコレクション(例: GEOMETRYCOLLECTION または MULTI*)の場合は、指定されたインデックスのジオメトリを返します。指定されたインデックスが1未満またはコレクション内の要素の合計数より大きい場合は、NULLを返します。要素の合計数を確認するには :func:ST_NumGeometries を使用してください。単一のジオメトリ(例: POINT, LINESTRING, POLYGON)は、1つの要素のコレクションとして扱われます。空のジオメトリは空のコレクションとして扱われます。

    SELECT gid, n, ST_GeometryN(the_geom, n)
    FROM tbl CROSS JOIN generate_series(1,100) n WHERE n <= ST_NumGeometries(the_geom);

ST_ConvexHull() 地理空間関数の追加

すべての入力ジオメトリを囲む最小の凸ジオメトリを返します。この関数はジオメトリコレクションをサポートしていません。

    SELECT t.tbl_type, ST_ConvexHull(ST_Collect(t.the_geom)) As the_geom
    FROM tbl As t
    GROUP BY t.tbl_type;

wilson_interval_lower() および wilson_interval_upper() 関数の追加

z スコア Z で指定された信頼度でのベルヌーイ試行プロセスのウィルソン スコア区間の下限を返します。

    assertFunction("ST_AsText(ST_EnvelopeAsPts(ST_GeometryFromText('MULTIPOINT (1 2, 2 4, 3 6, 4 8)')))",
    VARCHAR, "MULTIPOINT ((1 2), (4 8))");