2011-02-01 110 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

您能否解釋1-3-2011的last_date_for_return_calculation來自哪裏?我沒有看到你的樣本數據。也許今年剛剛結束呢? – kbrimington 2011-02-01 13:57:57

+0

正如我在問題中寫的那樣,這將是下個月的第一天。 – awsome 2011-02-01 14:02:06

+0

「last_price_of_month」是什麼意思?哪個月?哪一年? – bluish 2011-02-01 14:13:24

回答

1

根據您的要求,看起來您的日期是在2011年,而不是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

這是可能的查詢。

但是,如果你只是像這樣查詢表並在程序端過濾它,你可能會更好。