查询获取数据

时间:2011-02-01 13:49:17

标签: sql oracle

我是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(最后一个月的价格日期),
  • return((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     

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

可以使用查询。

但如果您只是查询表格并在程序端过滤它,那么您可能会更好。