象と戯れ

 | 

2009-11-28

8.5に向けたFRAME句の追加

18:53 | 8.5に向けたFRAME句の追加 - 象と戯れ を含むブックマーク はてなブックマーク - 8.5に向けたFRAME句の追加 - 象と戯れ

CommitFest:2009-11も折り返し地点。サマライズは別途しますが、今回はウィンドウ関数の続きを1個やることにしました。で、追加予定のSQLの例がこれ。

SELECT sum(unique1) over
	(rows (SELECT unique1 FROM tenk1 ORDER BY unique1 LIMIT 1) + 1 PRECEDING),
	unique1
FROM tenk1 where unique1 < 10;

ウィンドウのフレームを定義するときにPRECEDING/FOLLOWINGを使って物理的または論理的なフレームの境界を定義できるわけです。例えば「1行前から1行後までの移動平均」を計算する場合は

SELECT avg(val) OVER (ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM tbl;

となるわけです。ところが、SQL標準によれば「1」のところは<unsigned value specification>となっており、<unsigned value specification>は<unsigned literal>もしくは<general value specification>と定義されており、それはつまりSQLパラメータを始めとするかなり広範囲の値を指定できることを意味しています。

<window frame preceding> ::= <unsigned value specification> PRECEDING
<window frame following> ::= <unsigned value specification> FOLLOWING
<unsigned value specification> ::= <unsigned literal> | <general value specification>

で、PostgreSQL上の構文上はa_expr(いわゆる「式」)で表現し、パーサー内部でテーブルのカラム(local Vars)があったらエラーとするように実装しました。つまりこれはLIMIT句での表現と同様です。

その結果最初のSQLのような奇天烈な記述が可能となっています。OracleDB2での例でも上記のようなものは見たことがないですが、こんなSQL書く人の気が知れないし書きたくない。でもとりあえず仕様通りに作るのは楽しい。

 |