2017-09-18 1 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:これは例ですが、日付に日付関数を使用する場合は、データベースに日付型として日付列を入れるのが賢明かもしれません。しかし、ここで議論していることではありません。 – 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') ; 

注:これは、あなたが最初と最後の日を望んでいることを前提としていJan 1st aとは対照的に、データ12月31日

0

グループを1年ごとに表示し、年の最初の日(MAX(price) KEEP (DENSE_RANK FIRST ORDER BY year))と今年の最終日の最も低い価格(MIN(price) KEEP (DENSE_RANK LAST ORDER BY year))で最も高い価格を見つけて、その2つの値の間の増加率を計算できます。

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") 
関連する問題