
pl/pgsql にて。
select avg(price) into wk_price from uriage_tbl where ymdtm <= current_timestamp and ymdtm >= current_timestamp + '-4 hour';
と4時間前から直近まで価格の平均を求める構文があったとして、この-4 を、希望する任意の数字で変動したいと思っています。
-4 部分を変数にするには、どのようにすればよいか、お分かりの方がいらっしゃればお教え願います。
日付型の計算だと、上記のようにシングルクオーテーション内に引数を持たせるので、その中で変数を持たせるところでつまづいてます。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
考え方としては、時間型の変数を定義して加減算します。
例えば、
current_timestamp + time '04:00:00'
を変数で行う場合、以下のようにします。
declare vTime time;
vTime:='04:00:00';
current_timestamp + vTime
以下に例を示します。
(1)表定義例
create table uriage_tbl
(ymdtm timestamp without time zone,
price int);
(2)プロシジャ定義例
create or replace function avg_price
(pPM char(1), -- '+' or '-'
pHour time without time zone) -- 'hh:mm:ss'
returns dec(10,2) as $$
declare
wAvg dec(10,2);
begin
raise info 'pPM=%,pHour=%',pPM,pHour;
if pPM='+' then
select into wAvg -- 標準SQLと語順が異なっている
avg(price)
from uriage_tbl
where ymdtm>=current_timestamp
and ymdtm<=current_timestamp + pHour;
elseif pPM='-' then
select into wAvg -- 標準SQLと語順が異なっている
avg(price)
from uriage_tbl
where ymdtm>=current_timestamp - pHour
and ymdtm<=current_timestamp;
else
wAvg:=null;
end if;
raise info 'wAvg=%',wAvg;
return wAvg;
end;
$$ language 'plpgsql'
;
(3)プロシジャ実行例
select avg_price('+','04:00:00');
select avg_price('-','04:00:00');
<注意>
PostgreSQL 8.2前後で、select intoの語順が変更になっているようです。
PostgreSQL 8.0では、「select into 変数 avg(列名) from 表名」、
PostgreSQL 8.2では、「select avg(列名) into 変数 from 表名」
上記の例題は、PostgreSQL 8.0での記述になっています。
No.1
- 回答日時:
こんにちは。
動的にSQLステートメントを作成してはいかがでしょう。
CREATE OR REPLACE FUNCTION fn_getavg(integer)
RETURNS NUMERIC AS $$
DECLARE
wk_price NUMERIC := -1;
BEGIN
EXECUTE 'SELECT avg(price) '
|| 'FROM public.uriage '
|| 'WHERE ymdtm <= current_timestamp '
|| 'AND ymdtm >= current_timestamp + interval '''
|| to_char($1,'9')
|| ' hour'''
INTO wk_price;
return wk_price;
END;
$$LANGUAGE plpgsql;
-------------------------------------------------------------
こんな感じの関数をつくって、
SELECT public.fn_getavg(-4);
を実行。
回答案ありがとうございます。なるほどですね、これを参考に作成してみます。
私のこの質問でこのレベルの回答が頂けるとは、とても嬉しい限りです!仕事を手伝って欲しいくらいです。笑。
COBOL上がりでSQL、PL/PGSQL的な考え方が若干苦手であります。。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SELECT INTOで一度に複数の変数...
-
【SQL】他テーブルに含まれる値...
-
PostgresSQLで自動計算
-
フラグをたてるってどういうこ...
-
追加クエリで重複データなしで...
-
【sqlite3】deleteしても.dbフ...
-
ExcelのMatch関数のようなもの...
-
dumpでインデックスだけ抜きたい
-
エクセルVBA 10分後にエクセル...
-
グループ単位での表示?
-
serial型について
-
オラクルのUPDATEで複数テーブル
-
テーブル定義書(Oracle) 【IX】...
-
VBAでの行数を揃える方法
-
SQLサーバに対するSQL文で抽出...
-
UPDATEで既存のレコードに文字...
-
Accessの構成をコピーしたい
-
データベース ユーザの「このユ...
-
副問合せを使わずにUNIONと同様...
-
テーブル名が可変の場合のクエ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT INTOで一度に複数の変数...
-
UPDATEの更新前の値を取得したい
-
複数の条件に該当する結果を、...
-
SELECTした結果に行番号を求めたい
-
データの入れ替えを同時に行な...
-
ダブリ数字の有無の確認にのマ...
-
プログラムよりファンクション...
-
PLPGSQLでの複数行複数列
-
副問合せで複数列の値リストの...
-
Pro*CでのSQL文について
-
where notにつて
-
パターンマッチング
-
SQLで小数点の計算がしたいです。
-
oleDBでnumeric形式の小数部分...
-
FETCH した行が取り出せない
-
複数カラムでdistinct
-
テーブル間の差分抽出方法は?...
-
SQLで任意の列の最大値の定数は...
-
【SQL】他テーブルに含まれる値...
-
フラグをたてるってどういうこ...
おすすめ情報