与LAG解析函数比较
Comparing with LAG Analytic function
我正在使用甲骨文PL/SQL。
我正在尝试将列值与 LAG
函数进行比较。
声明如下:
decode(LAG(col1,1) OVER (ORDER BY col3),col1,'No Change','Change_Occured') Changes
至于第一行,LAG 将始终与前一个空行进行比较。因此,对于我的查询,列 'Changes'
的第一行始终将值显示为 Change_Occured
,而实际上没有发生任何变化。有什么办法可以处理这种情况吗?
假设这个 table:
| 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
可能是:
decode(LAG(col1,1, col1) OVER (ORDER BY col3),col1,'No Change','Change_Occured') Changes
如果偏移量超出 window 的范围,则返回可选的默认值。如果不指定default,那么它的默认值为null。
LAG 解析函数的语法为:
LAG (value_expression [,offset] [,default]) OVER ([query_partition_clause] order_by_clause)
- default - 如果偏移量超出 window 范围则返回的值。默认值为 NULL。
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, LAG(col1,1) OVER (ORDER BY col2) changes FROM sample_data;
COL1 CHANGES
---------- ----------
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>
我正在使用甲骨文PL/SQL。
我正在尝试将列值与 LAG
函数进行比较。
声明如下:
decode(LAG(col1,1) OVER (ORDER BY col3),col1,'No Change','Change_Occured') Changes
至于第一行,LAG 将始终与前一个空行进行比较。因此,对于我的查询,列 'Changes'
的第一行始终将值显示为 Change_Occured
,而实际上没有发生任何变化。有什么办法可以处理这种情况吗?
假设这个 table:
| 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
可能是:
decode(LAG(col1,1, col1) OVER (ORDER BY col3),col1,'No Change','Change_Occured') Changes
如果偏移量超出 window 的范围,则返回可选的默认值。如果不指定default,那么它的默认值为null。
LAG 解析函数的语法为:
LAG (value_expression [,offset] [,default]) OVER ([query_partition_clause] order_by_clause)
- default - 如果偏移量超出 window 范围则返回的值。默认值为 NULL。
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, LAG(col1,1) OVER (ORDER BY col2) changes FROM sample_data; COL1 CHANGES ---------- ---------- 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>