分析函数 - 使用 LAG() 比较值

Posted

技术标签:

【中文标题】分析函数 - 使用 LAG() 比较值【英文标题】:Analytic function - Comparing values using LAG() 【发布时间】:2015-12-31 10:46:56 【问题描述】:

假设以下数据:

| Col1  |   Col2      |
| 3     |  20-dec-15  |
| 4     |  20-dec-15  |
| 8     |  25-dec-15  |
|10     |  25-dec-15  |

我必须比较特定日期的 Col1 列的值。

例如:2015 年 12 月 20 日发生的变化是 3 变为 4。

我必须使用分析函数来解决这个问题。

以下是我正在使用的查询

decode(LAG(Col1,1,Col1) OVER (partition by Col2 order by Col2),Col1,0,1) Changes

由于Col2 是日期列,按日期分区对我不起作用。我们可以将日期列应用为分区吗?

预期结果应该是:

| Changes  | 
| 0        |
| 1        |
| 0        |
| 1        |

这里的 1 表示在比较同一日期时发生了变化。

【问题讨论】:

【参考方案1】:

您需要使用trunc() 将时间部分重置为00:00:00,但您仍应保留order by col2,以便同一天的所有行都按时间部分排序:

我也更喜欢明确的case 来进行这种比较,我个人觉得 decode() 真的很难阅读:

select case 
         when col1 = lag(col1,1,col1) over (partition by trunc(col2) order by col2) then 0 
         else 1
       end as changes
from the_table;

【讨论】:

我试过 to_date(col2) ,这似乎有效。 @subi_speedrunner: to_date()varchar 值转换为 date 值。请不要在定义为date 的列上使用它。它将首先将date 隐式转换为varchar,只是为了将其转换回最初的date 感谢您提供此信息。我会确保不要将to_date()Date 字段一起使用。

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

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

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

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

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

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

oracle lag与lead分析函数简介