【发布时间】:2015-06-09 20:17:12
【问题描述】:
我需要一个函数来规范化我的输入表 features 值。
我的 features 表有 9 列,其中 x1,x2...x6 是我需要缩放的输入列。
我可以通过使用静态查询来做到这一点:
create or replace function scale_function()
returns void as $$
declare tav1 features%rowtype; rang1 features%rowtype;
begin
select avg(n),avg(x0),avg(x1),avg(x2),avg(x3),avg(x4),avg(x5),avg(x6),avg(y)
into tav1 from features;
select max(n)-min(n),max(x0)-min(x0),max(x1)-min(x1),max(x2)-min(x2),max(x3)-min(x3),
max(x4)-min(x4),max(x5)-min(x5),max(x6)-min(x6),max(y)-min(y)
into rang1 from features;
update features
set x1= (x1-tav1.x1)/(rang1.x1),x2= (x2-tav1.x2)/(rang1.x2),
x3= (x3-tav1.x3)/(rang1.x3),x4= (x4-tav1.x4)/(rang1.x4),
x5= (x5-tav1.x5)/(rang1.x5),x6= (x6-tav1.x6)/(rang1.x6),
y= (y-tav1.y)/(rang1.y);
return;
end;
$$ language plpgsql;
但现在我需要一个动态查询来缩放我的features 表中的 n 列值,即x1,x2...,xn(假设我有 200 多列)。我正在尝试这段代码,但这不起作用,因为用户定义的数据类型存在问题:
create or replace function scale_function(n int)
returns void as $$
declare
tav1 features%rowtype;
rang1 features%rowtype;
query1 text :=''; query2 text :='';
begin
for i in 0..n
loop
query1 := query1 ||',avg(x'||i||')';
query2 := query2||',max(x'||i||')-min(x'||i||')';
end loop;
query1 := 'select avg(n)'||query1||',avg(y) into tav1 from features;';
execute query1;
query2 := 'select max(n)-min(n)'||query2||',max(y)-min(y) into rang1 from features;';
execute query2;
update features
set x1= (x1-tav1.x1)/(rang1.x1), ... ,xn=(xn-tav1.xn)/(rang1.xn)
,y= (y-tav1.y)/(rang1.y);
return;
end;
$$ language plpgsql;
在这里,我试图将列的 avg() 值转换为用户定义的行类型 tav1,并且必须使用该 tav1 值来更新。
谁能帮助我如何使用动态查询“n”个这样的列来更新features 表值?
************ Error ************ ERROR: column "avg" specified more than once SQL state: 42701 Context: SQL statement "select avg(n),avg(x0),avg(x1),avg(x2),avg(x3),avg(x4),avg(x5),avg(x6),avg(y) into tav1 from features;" PL/pgSQL function scale_function(integer) line 12 at EXECUTE statement
我使用的是 PostgreSQL 9.3.0。
【问题讨论】:
-
请(始终)提供您的 Postgres 版本以及您收到的逐字错误消息。
-
感谢@ErwinBrandstetter 的建议,我已按要求编辑了问题。
-
表
features的确切定义会有所帮助 - 你在 psql 中使用\d features得到什么。
标签: sql postgresql sql-update plpgsql dynamic-sql