[pgsql-jp: 39892] Re: Lead関数で第3引数を指定すると文法エラーになる。

Tatsuhito Kasahara kasahara.tatsuhito @ oss.ntt.co.jp
2009年 6月 19日 (金) 14:51:56 JST


こんにちは 笠原と申します。

postgresqlmailabcd @ mail.goo.ne.jp wrote:
> --Lead関数で第3引数を指定すると下記のエラーが発生します。
> postgres=# select ID,SortKey,Val,
> postgres-# Lead(Val,2,999) over(partition by ID order by SortKey)
> postgres-#   from tes;
> ERROR:  function lead(smallint, integer, integer) does not exist
型の指定が良くないため弾かれているようです
lead()の引数は (value, offset, default) ですが、value と offset は
型が一緒である必要があります。

SELECT proname, proargtypes, prosrc FROM pg_proc WHERE proname = 'lead';
 proname | proargtypes  |               prosrc
---------+--------------+-------------------------------------
 lead    | 2283         | window_lead
 lead    | 2283 23      | window_lead_with_offset
 lead    | 2283 23 2283 | window_lead_with_offset_and_default ★

SELECT oid, typname FROM pg_type WHERE oid IN (23, 2283);
 oid  |  typname
------+------------
   23 | int4
 2283 | anyelement

★= proargtypes(引数の型) が 2283(anyelement), 23(int4), 2283(anyelement) の必要あり。

なので、例えば以下の様にすると通ると思います。

-- Val と 999 を smallint で統一
select ID,SortKey,Val,
Lead(Val,2,999::smallint) over(partition by ID order by SortKey)
  from tes;

-- Val と 999 を int で統一
select ID,SortKey,Val,
Lead(Val::int,2,999) over(partition by ID order by SortKey)
  from tes;

どうでしょうか?

-- 
NTT OSSセンタ

笠原辰仁
kasahara.tatsuhito @ oss.ntt.co.jp



pgsql-jp メーリングリストの案内