Sql 与滞后分析函数的比较

Sql 与滞后分析函数的比较,sql,oracle,oracle11g,lag,window-functions,Sql,Oracle,Oracle11g,Lag,Window Functions,我正在使用oraclepl/SQL 我试图将列值与LAG函数进行比较。 以下是声明: decode(LAG(col1,1) OVER (ORDER BY col3),col1,'No Change','Change_Occured') Changes 对于第一行,LAG将始终与前一个空行进行比较。因此,对于我的查询,'Changes'列的第一行总是将值显示为Change\u occurrented,而实际上没有发生任何更改。有没有办法处理这种情况 假设此表: | col1 | col2 |

我正在使用oraclepl/SQL

我试图将列值与
LAG
函数进行比较。

以下是声明:

decode(LAG(col1,1) OVER (ORDER BY col3),col1,'No Change','Change_Occured') Changes
对于第一行,LAG将始终与前一个空行进行比较。因此,对于我的查询,
'Changes'
列的第一行总是将值显示为
Change\u occurrented
,而实际上没有发生任何更改。有没有办法处理这种情况

假设此表:

| col1 | col2 | 
|  2   | 3    |
|  2   | 6    |
|  2   | 7    |
|  2   | 9    |
col1
的每一行与前面的值进行比较,因此结果将是

| col1 | col2 | Changes        |
|  2   | 3    | Change_occured |
|  2   | 9    | No Change      |
|  2   | 5    | No Change      |
|  2   | 8    | No Change      |
因此,我应该如何处理列
的第一行更改

可能是:

decode(LAG(col1,1, col1) OVER (ORDER BY col3),col1,'No Change','Change_Occured') Changes

如果偏移量超出窗口范围,则返回可选的默认值。如果未指定默认值,则其默认值为空。

分析函数的语法为:

LAG  (value_expression [,offset] [,default]) OVER ([query_partition_clause] order_by_clause)
  • 默认值-如果偏移量超出窗口范围,则返回的值。默认值为空
比如说,

SQL> WITH sample_data AS(
  2  SELECT 2 col1, 3 col2 FROM dual UNION ALL
  3  SELECT 2 col1, 6 col2 FROM dual UNION ALL
  4  SELECT 2 col1, 7 col2 FROM dual UNION ALL
  5  SELECT 2 col1, 9 col2 FROM dual
  6  )
  7  -- end of sample_data mimicking real table
  8  SELECT col1,
  9         DECODE(
 10                LAG(col1,1, col1) OVER (ORDER BY col2),
 11                col1,
 12                'No Change',
 13                'Change_Occured'
 14               ) Changes
 15  FROM sample_data;

      COL1 CHANGES
---------- --------------
         2 No Change
         2 No Change
         2 No Change
         2 No Change

SQL>

请提供示例数据并显示您的预期输出。我添加了默认数据。
DECODE(LAG(col1,1, col1) OVER (ORDER BY col2),col1,'No Change','Change_Occured') Changes
SQL> WITH sample_data AS(
  2  SELECT 2 col1, 3 col2 FROM dual UNION ALL
  3  SELECT 2 col1, 6 col2 FROM dual UNION ALL
  4  SELECT 2 col1, 7 col2 FROM dual UNION ALL
  5  SELECT 2 col1, 9 col2 FROM dual
  6  )
  7  -- end of sample_data mimicking real table
  8  SELECT col1,
  9         DECODE(
 10                LAG(col1,1, col1) OVER (ORDER BY col2),
 11                col1,
 12                'No Change',
 13                'Change_Occured'
 14               ) Changes
 15  FROM sample_data;

      COL1 CHANGES
---------- --------------
         2 No Change
         2 No Change
         2 No Change
         2 No Change

SQL>