分析函数 - 使用LAG()

时间:2015-12-31 10:46:57

标签: sql oracle oracle11g window-functions

假设以下数据:

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

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

例如:对于20-dec-15发生的变化,因为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 个答案:

答案 0 :(得分:1)

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

我也更喜欢显式的case进行这种比较,我个人觉得解码()真的很难阅读:

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;