2017-09-18 41 views
0

我有一個包含價格每天的行,例如股票價格或士力架的價格其實並不重要計算價格的年回報率多年來

日期= DD.MM.YYYY

row | date  | price 
1 | 1.1.2015 | 23.3 
2 | 4.5.2015 | 25.8 
3 | 6.9.2015 | 27.3 
4 | 31.12.2015 | 28.1 
... 
5 | 1.1.2016 | 28.1 
6 | 7.10.2016 | 29.3 
7 | 2.11.2016 | 30.3 
8 | 31.12.2016 | 33.3 
... 
9 | 1.1.2017 | 33.3 
10 | 3.1.2017 | 39.7 
11 | 15.9.2017 | 41.2 


1.1和31.12之間的日期在這個例子中並不重要。我只是看一年的第一天,然後是一年的最後一天的價格。

例結果會是這樣的數據:

row | year | return 
1 | 2015 | 20% 
2 | 2016 | 23% 
3 | 2017 | 20% 

我怎能組行分爲多年,也算有日期的行之間的區別:即當年1.1的第一天, 31.12的最後一天?

+0

你真的把日期存儲爲字符串嗎? –

+0

@juergend:這是一個例子,但是如果你想在日期中使用日期函數,將date列作爲數據庫中的日期類型可能是明智的做法。但這不是我們在這裏討論的內容。 – aghaux

回答

0

我覺得你只是想在第一年和最後一年爲計算值:

select rownum as "row", to_char(date, 'YYYY') as yyyy, 
     max(price) keep (dense_rank first order by date asc) as first_price, 
     max(price) keep (dense_rank first order by date desc) as last_price, 
     ((max(price) keep (dense_rank first order by date desc)/
      max(price) keep (dense_rank first order by date asc) 
     ) - 1 
     ) as "return" 
from t 
group by to_char(date, 'YYYY') 
order by to_char(date, 'YYYY') ; 

注:這是假設你想在第一天和最後一天數據,而不是1月1日a nd 12月31日。

0

按年份分組,然後您可以在該年的第一天(MAX(price) KEEP (DENSE_RANK FIRST ORDER BY year))和當年最後一天的最低價格(MIN(price) KEEP (DENSE_RANK LAST ORDER BY year))中找到最高價格,並計算這兩個值之間的增加百分比:

SELECT rownum AS "row", 
     EXTRACT(YEAR FROM "date") AS year, 
     (MIN(price) KEEP (DENSE_RANK LAST ORDER BY year) 
     /MAX(price) KEEP (DENSE_RANK FIRST ORDER BY year) 
     * 100 
     ) - 100 
     AS "return" 
FROM your_table 
GROUP BY EXTRACT(YEAR FROM "date")