Можно ли создать функцию, которая создает столбец меньшего размера, чем входной столбец
Я работаю над базой данных 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
В чем причина проблемы? Я предполагаю, что это как-то связано с вышеописанной проблемой.