2011-10-14 34 views
2

我有一个表3行包含值:如何在Oracle数据库中计算增加/减少的百分比?

Row1 : 5 
Row2 : 8 
Row3 : 9 

我希望计算增加或减少的百分比:行2相比ROW1,ROW3到行2,所以我将具有该表中: 的公式计算%是:[Row(n+1) - Row(n)]/Row(2)

 Value Percentage 
Row1 : 5   - 
Row2 : 8  60% (increase compared to Row1) | (8-5)/5 
Row3 : 9  12.5%(increase compared to Row2)| (9-8)/8 

请提出建议的方式或解决方案。

谢谢大家。

回答

6

您需要使用Oracle分析函数LAG:

您的查询将看起来像:

SELECT ((value - lagv)/lagv) * 100 
    FROM (
     SELECT value, 
       LAG(value) OVER(ORDER BY <ordering_column>) as lagv 
      FROM table1 
); 

为了测试我跑:

WITH t AS (SELECT 1 as rnum, 
        5 AS value FROM DUAL 
      UNION 
      SELECT 2 as rnum, 
        8 AS value FROM DUAL 
      UNION 
      SELECT 3 as rnum, 
        9 AS value FROM DUAL 
     ) 
SELECT ((value - lagv)/lagv) * 100 AS Percentage 
    FROM (
     SELECT value, 
       LAG(value) OVER(ORDER BY rnum) as lagv 
      FROM t 
); 

,它返回:

Row Percentage 
    1   
    2   60 
    3  12.5 

A您需要为LAG函数指定一个订单我已经创建了rnum列,我假设您的表具有某种您可以使用的排序列(否则,您如何知道要比较哪些行?)。

希望这有助于...

编辑:此链接是学习Oracle的超前滞后功能非常有用。 http://www.oracle-base.com/articles/misc/LagLeadAnalyticFunctions.php

+0

如果存在空值并且只想计算最近非空值的百分比变化,该怎么办? – jvalenti