Можно ли создать функцию, которая создает столбец меньшего размера, чем входной столбец

Я работаю над базой данных Monetdb со встроенным R. Теперь я хочу обработать данные из столбца, что в основном уменьшает количество значений.

Вопрос теперь в том, возможно ли создать функцию 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 ответов

Другие вопросы по тегам