你能用纯SQL做到这一点吗?我需要做这样的事情:
initial_value = 10000
start_value = 10000
LOOP
start_value = start_value * (1 + (['table column'] / 100));
percent = ((start_value - initial_value) / initial_value) * 100;
END
所以,基本上我在查询运行时进行聚合。但是参考查询中的先前值,我不认为这是可能的。最后,这需要是一个记录集,我可以打开游标并读取应用程序。
希望不必创建对象类型,或使用临时表。它似乎是一种简单的操作,查询和运行一些聚合,但我认为这是保持运行数字这是一个问题。
任何想法或建议都会很棒。
将表定义并填充为
create table some_table (table_column number);
insert into some_table (table_column) values (1000);
insert into some_table (table_column) values (2000);
insert into some_table (table_column) values (3000);
insert into some_table (table_column) values (4000);
insert into some_table (table_column) values (5000);
insert into some_table (table_column) values (6000);
insert into some_table (table_column) values (7000);
insert into some_table (table_column) values (8000);
insert into some_table (table_column) values (9000);
insert into some_table (table_column) values (10000);
我们可以使用LAG
分析函数来获得你想要的东西。可能有更紧凑的方法来完成此任务,但以下内容应作为演示:
WITH cteValues AS (SELECT 10000 AS START_VALUE,
10000 AS INITIAL_VALUE
FROM DUAL)
SELECT 1 + (TABLE_COLUMN / 100) +
LAG(START_VALUE + 1 + (TABLE_COLUMN / 100), 1, INITIAL_VALUE)
OVER (ORDER BY TABLE_COLUMN) AS RUNNING_VALUE,
((1 + (TABLE_COLUMN / 100) +
LAG(START_VALUE + 1 + (TABLE_COLUMN / 100), 1, INITIAL_VALUE)
OVER (ORDER BY TABLE_COLUMN)) - INITIAL_VALUE) / INITIAL_VALUE AS PERCENT_VALUE
FROM cteValues c
CROSS JOIN SOME_TABLE s;
祝你好运。
也许你可以使用一个返回PIPELINED行的函数。见下面的样本。
CREATE TYPE num_table IS TABLE OF NUMBER;
/
--here you can apply your program logic
CREATE FUNCTION get_nums(start_num NUMBER, end_num NUMBER) RETURN num_table PIPELINED
IS
BEGIN
FOR num_loop IN start_num..end_num
LOOP
PIPE ROW(num_loop);
END LOOP;
END;
/
SELECT *
FROM table(get_nums(100, 200));