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

这是可能的查询。

但是,如果你只是像这样查询表并在程序端过滤它,你可能会更好。