2011-02-01 17 views
1

私はSQLへの初心者であり、複雑なようなクエリを書く必要があります。私がどのように見えるテーブルから戻って取得するためのクエリ記述する必要が :ここデータを取得するためのクエリ

id Price_date price 
1  1-1-2010  20  
1  2-2-2010  21  
1  7-2-2010  22  
1  27-2-2010 23  
1  3-3-2010  23 

は、私は上記の表から選択するために必要なものである: -

  • ID、
  • price_date (月の最終価格の日)、
  • リターン((last_price_of_month/last_price_of_previous_month)-1)、
  • last_date_for_return_calculation(翌月の初日)

サンプルデータは次のようになります: - 誰かがこの問題を解決するために私を助けてもらえ

id  price_date return  last_date_for_return_calculation  
    1  27-2-2010 (23/20 -1) 1-3-2011  

+0

2011年1月3日のlast_date_for_return_calculationはどこから来たのか説明できますか?あなたのサンプルデータには表示されません。多分年はちょうど1つだけ離れていますか? – kbrimington

+0

私が質問に書いたように、次の月の最初の日になります。 – awsome

+0

「last_price_of_month」はどういう意味ですか?どの月?うちの年? – bluish

答えて

1

あなたの要件に基づいて、あなたの日付は2010年ではないようです。また、1月にサンプルデータの前月の最後の行を取得するために行を追加しました。

SQL> WITH DATA AS (
    2 SELECT 1 id, to_date('1-1-2011', 'dd-mm-yyyy') Price_date, 19.5 price 
    3 FROM DUAL 
    4 UNION ALL SELECT 1, to_date('31-1-2011', 'dd-mm-yyyy'), 20 FROM DUAL 
    5 UNION ALL SELECT 1, to_date('2-2-2011', 'dd-mm-yyyy'), 21 FROM DUAL 
    6 UNION ALL SELECT 1, to_date('7-2-2011', 'dd-mm-yyyy'), 22 FROM DUAL 
    7 UNION ALL SELECT 1, to_date('27-2-2011', 'dd-mm-yyyy'), 23 FROM DUAL 
    8 UNION ALL SELECT 1, to_date('3-3-2011', 'dd-mm-yyyy'), 23 FROM DUAL 
    9 ) 
10 SELECT ID, 
11   MAX(price_date) price_date, 
12   MAX(price) KEEP (DENSE_RANK FIRST ORDER BY price_date DESC) 
13  /MAX(price) 
14   KEEP (DENSE_RANK FIRST 
15     ORDER BY CASE WHEN price_date < trunc(SYSDATE, 'month') 
16        THEN price_date END 
17     DESC NULLS LAST) - 1 RETURN, 
18   add_months(trunc(SYSDATE, 'month'), 1) last_date_for_return_calc 
19 FROM DATA 
20 WHERE price_date >= add_months(trunc(SYSDATE, 'month'), -1) 
21  AND price_date < add_months(trunc(SYSDATE, 'month'), 1) 
22 GROUP BY ID; 

     ID PRICE_DATE  RETURN LAST_DATE_FOR_RETURN_CALC 
---------- ----------- ---------- ------------------------- 
     1 27/02/2011  0,15 01/03/2011 
+0

あなたは以前の価格を見つけるためにsysdateを使用しました。もっと明快さを加えるために、私は2011年にそれを行うだけでなく、すべてのデータ1983年)となり、復帰計算の間隔は1ヶ月である。 – awsome

0

クエリで可能です。

しかし、そのようなテーブルをクエリしてプログラム側でフィルタリングすれば、おそらくあなたの方がよいでしょう。

+0

これは良い解決策ではありません。少なくとも先月の最終価格とその部分のためです。 –

関連する問題