2007年12月21日

[pgsql-jp: 39014]行番号を取得するユーザー関数について

PostgreSQL8.2にてOracleのRownumのような、行番号を取得す

ユーザー関数を作りたいと思っています。
以下のような関数をつくり、行番号を取得しようと考えている
のですが
どうしても思ったような動作ができず投稿させていただきまし
た。

-- function:[getrownum(text)]
CREATE OR REPLACE FUNCTION getRownum(text) RETURNS INTEGER
AS
'
DECLARE
seq_tmpname ALIAS FOR ;
seq_count INTEGER DEFAULT 0;
ret_value INTEGER DEFAULT 0;
sql TEXT;
BEGIN
SELECT COUNT(*) INTO seq_count FROM pg_class
WHERE relname=seq_tmpname ;
IF seq_count=0 THEN
sql := ''CREATE TEMP SEQUENCE
''||seq_tmpname;
EXECUTE sql;
END IF;
SELECT NEXTVAL(seq_tmpname) INTO ret_value;
RETURN ret_value;
END;
'
LANGUAGE 'plpgsql';


たとえば、下のような日付順にソートされたテーブル(ビュー)
があり、
[view_datatable]
-----------------------------------
p_date(timestamp) p_value(integer)
-----------------------------------
2007/12/01 10
2007/12/02 15
2007/12/04 30
2007/12/07 45
2007/12/08 50
2007/12/09 75

このテーブルから1つ前のレコードからの増加量を求めようと
しています。
そこで、作成した関数を使用して下のようなビューを作成しま
した。

[view_datatable_offset]
CREATE VIEW view_datatable_offset AS
SELECT
tbl1.p_date
,tbl2.p_value AS p_value_tbl2
,tbl1.p_value AS p_value_tbl1
,tbl1.p_value-tbl2.p_value AS p_value_offset
FROM
(SELECT
getrownum('tmpseq1') AS rownum,*
FROM view_datatable ORDER BY p_date
) AS tbl1
,
(SELECT
getrownum('tmpseq2')+1 AS rownum,*
FROM view_datatable ORDER BY p_date
) AS tbl2

WHERE tbl1.rownum = tbl2.rownum;

これで、

SELECT * FROM view_datatable_offset

というSQLを発行しますと
--------------------------------------------------
p_date p_value_tbl2 p_value_tbl1 p_value_offset
--------------------------------------------------
2007/12/02 10 15 5
2007/12/04 15 30 15
2007/12/07 30 45 15
2007/12/08 45 50 5
2007/12/09 50 75 25

と、予想どおりの結果が帰ってくるのですが、

SELECT * FROM view_datatable_offset WHERE p_value_tbl1 =
15

という風に条件をいれると結果がもどってきません。
また、

SELECT * FROM view_datatable_offset WHERE p_date >
'2007/12/07'

という条件をいれると、
--------------------------------------------------
p_date p_value_tbl2 p_value_tbl1 p_value_offset
--------------------------------------------------
2007/12/08 45 50 5
2007/12/09 50 75 25
という結果が帰らず、

--------------------------------------------------
p_date p_value_tbl2 p_value_tbl1 p_value_offset
--------------------------------------------------
2007/12/09 10 75 65
という結果になってしまいます。


この問題について、他の掲示板にて質問をし、行番号を使用し
ない
代替え案をアドバイスいただいたのですが、速度的に不安な面
があ
り、どうにかして、ユーザー関数で行番号を取得できないか悩
んで
います。

長文で申し訳ありませんが、ご教授よろしくお願いします。

投稿者 xml-rpc : 2007年12月21日 20:50
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/67893
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。