该MODEL
子句可以解决这个问题:
测试数据:
create table test1(n number unique);
insert into test1 select * from table(sys.odcinumberlist(1,2,5,10));
commit;
询问:
--The last row for each N has the final coscos value.
select n, coscos
from
(
--Set each value to the cos() of the previous value.
select * from
(
--Each value of N has N rows, with value rownumber from 1 to N.
select n, rownumber
from
(
--Maximum number of rows needed (the largest number in the table)
select level rownumber
from dual
connect by level <= (select max(n) from test1)
) max_rows
cross join test1
where max_rows.rownumber <= test1.n
order by n, rownumber
) n_to_rows
model
partition by (n)
dimension by (rownumber)
measures (0 as coscos)
(
coscos[1] = cos(0),
coscos[rownumber > 1] = cos(coscos[cv(rownumber)-1])
)
)
where n = rownumber
order by n;
结果:
N COSCOS
1 1
2 0.54030230586814
5 0.793480358742566
10 0.73140404242251
让圣战开始吧:
这个查询是个好主意吗?我不会在生产中运行这个查询,但希望它是一个有用的演示,任何问题都可以用 SQL 解决。
我已经看到实际上浪费了数千个小时,因为人们害怕使用 SQL。如果您大量使用数据库,那么不使用 SQL 作为您的主要编程语言是愚蠢的。偶尔花几个小时来测试一下 SQL 的极限是很好的。为了避免感染许多数据库程序员的灾难性的逐行处理思维方式,一些奇怪的查询是一个很小的代价。