실용성이 있는 SQL 퀴즈입니다.
참 오래간만에 사랑넷에 온 것 같은데요... 오늘 낮에 회사에서 일하다가. 옛날에 java로 작성한 irr 함수가 있어서 이것을 순수 SQL로 가능할까? 하는 질문을 스스로에게 던졌더니 의외로 재미 있는 결과가 나와서 이렇게 퀴즈로 냅니다.
먼저 IRR(ko.wikipedia.org/wiki/%EB%82%B4%EB%B6%80%EC%88%98%EC%9D%B5%EB%A5%A0)
이 무어냐면 NPV(순현재가치ko.wikipedia.org/wiki/%EC%88%9C%ED%98%84%EC%9E%AC%EA%B0%80%EC%B9%98)를 0으로 만드는 할인율을 말합니다.
NPV는 현금흐름이 주어질 때 이 현금흐름의 현가 할인 가치의 합계를 말합니다.
뭐 자세한 공부는 재미 없으니까 인터넷을 찾아보시면 있구요 우리 프로그래머는 코드로 말하니까...
다음과 같이 임의의 10개의 현금흐름을 만들 때
with base as
(
select level seq
, dbms_random.value(-10000000000,10000000000) amt
, 0.01 rat
from dual
connect by
level <= 10
)
다음과 같은 SQL로 구할 수 있습니다.
with base as
(
select level seq
, dbms_random.value(-10000000000,10000000000) amt
, 0.01 rat
from dual
connect by
level <= 10
)
select
b.amt / nullif(power(1+b.rat ,b.seq),0) pv
, sum(b.amt / nullif(power(1+b.rat,b.seq),0)) over () npv
from base b
/
즉 이론을 몰라도 일단 공식이 있으니까 답을 구할 수 있다는 것이죠...
그런데 문제는 IRR이라는 것을 구해야 한다는 것인데
위의 문제에서 npv가 0이 되는 할인율(위의 경우 0.01이 할인율임) 을 구해야 한다는 것입니다.
엑셀에는 NPV나 IRR 함수가 있습니다(재무함수)
일반적으로 절차적 언어로 푼다면 시행착오법으로 구합니다.
근을 구하는 수치해석 방법있죠? f(x1) < 0 이고 f(x2) >0 인 경우 x~x2 구간사이에 반드시 하나 이상의 근이 있다는 것을 이용하는 것...
만약 SQL로 구한다면 어떻게 풀면 될까요?
이게 퀴즈입니다.
|