是否可以创建一个创建比输入列更小的列的函数

时间:2017-04-04 15:01:16

标签: r monetdb

我正在使用嵌入式R的Monetdb数据库。现在,我想处理列中的数据,这基本上减少了数值。

现在的问题是,是否可以创建一个R函数,该函数采用带有n值的输入列,并返回包含m (m <> n)列的列。

我尝试了但是函数的输出有些恼人:

-- create data
CREATE FUNCTION generate(n INTEGER) RETURNS TABLE(data DOUBLE) LANGUAGE R{
 data.frame(rnorm(n))
};

-- reduce data 
CREATE FUNCTION reduce(data REAL) returns DOUBLE LANGUAGE R{
 data[1:(length(data)-1)]
};

-- actually reduce generated data
select reduce(data) from generate(3);

这输出以下内容:

sql>select reduce(data) from generate(3);
+--------------------------+
| L4                       |
+==========================+
|      -0.6561001539230347 |
|       1.0922646522521973 |
+--------------------------+
2 tuples (47.601ms)

当我在输出中添加另一列时,有趣的想法发生了:

sql>select 1,reduce(data) from generate(3);
+------+--------------------------+
| L4   | L6                       |
+======+==========================+
|    1 |      -1.2222824096679688 |
|    1 |        2.696558952331543 |
+------+--------------------------+
3 tuples (5.455ms)

monetdb 认为提供更改的元组数。代码有什么问题,或者减少输出列的长度是错误的吗?

这只是真实问题的简化示例。将结果插入另一个表时会出现实际问题。

CREATE TABLE test(i INTEGER, r real);
insert into test select 1,reduce(data) from generate(3);
2 affected rows (4.404ms)

给出

select * from test;
GDK reported error.
BATproject: does not match always

问题的原因是什么?我认为它与上述问题有某种关联。

0 个答案:

没有答案