Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何计算Oracle数据库中增加/减少的百分比?_Sql_Oracle_Oracle10g - Fatal编程技术网

Sql 如何计算Oracle数据库中增加/减少的百分比?

Sql 如何计算Oracle数据库中增加/减少的百分比?,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,我有一个包含3行的表,其中包含值: Row1 : 5 Row2 : 8 Row3 : 9 我希望计算:第2行与第1行、第3行与第2行相比的增加或减少百分比,因此我将有以下表格: 计算%的公式是:[行(n+1)-行(n)]/行(2) 请提出方法或解决方案 谢谢大家。您需要使用Oracle分析功能LAG: 您的查询将类似于: SELECT ((value - lagv)/lagv) * 100 FROM ( SELECT value, LAG(va

我有一个包含3行的表,其中包含值:

Row1 : 5
Row2 : 8
Row3 : 9
我希望计算:第2行与第1行、第3行与第2行相比的增加或减少百分比,因此我将有以下表格: 计算%的公式是:
[行(n+1)-行(n)]/行(2)

请提出方法或解决方案


谢谢大家。

您需要使用Oracle分析功能LAG:

您的查询将类似于:

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

Row  Percentage
  1           
  2          60
  3        12.5
由于您需要为我创建的rnum列的LAG函数指定一个顺序,因此我假设您的表中有某种可以使用的排序列(否则您如何知道要比较哪些行?)

希望这有助于


编辑:此链接对于了解Oracle的超前和滞后功能非常有用

如果存在空值,并且只想计算最近的非空值的百分比变化,该怎么办?
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