与 LAG 分析函数比较

Posted

技术标签:

【中文标题】与 LAG 分析函数比较【英文标题】:Comparing with LAG Analytic function 【发布时间】:2015-12-30 07:54:48 【问题描述】:

我正在使用 oracle PL/SQL。

我正在尝试将列值与LAG 函数进行比较。 以下是声明:

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

对于第一行,LAG 将始终与前一个空行进行比较。因此,对于我的查询,'Changes' 列的第一行始终将值显示为Change_Occured,而实际上没有发生任何变化。有没有办法处理这种情况?

假设这张表:

| 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      |

那么我应该如何处理Changes列的第一行

【问题讨论】:

请提供示例数据并显示您的预期输出。 我已经添加了默认数据。 【参考方案1】:

LAG解析函数的语法是:

LAG  (value_expression [,offset] [,default]) OVER ([query_partition_clause] order_by_clause)
default - 如果偏移量超出窗口范围,则返回值。默认值为 NULL。 SQL> WITH sample_data AS( 2 从双 UNION ALL 中选择 2 col1、3 col2 3 SELECT 2 col1, 6 col2 FROM dual UNION ALL 4 从双 UNION ALL 中选择 2 col1、7 col2 5 SELECT 2 col1, 9 col2 FROM dual 6) 7 -- 模仿真实表的sample_data结束 8 SELECT col1, LAG(col1,1) OVER (ORDER BY col2) 从 sample_data 更改; COL1 更改 ---------- ---------- 2 2 2 2 2 2 2

因此,在 DECODE 表达式中,您将 NULL 值与实际值进行比较,并将其评估为 Change_Occurred

您可以使用默认值作为列值本身:

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>

【讨论】:

【参考方案2】:

可能是:

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

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

【讨论】:

以上是关于与 LAG 分析函数比较的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE 偏移分析函数 lag()与lead() 用法

ORACLE 偏移分析函数 lag()与lead() 用法

Hive 分析函数lead、lag实例应用

Oracle分析函数之Lag和Lead()使用

Hive分析函数LAG和LEAD详解

使用 Lag 分析函数查找丢失的小时