分析函数 - 使用 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() 比较值的主要内容,如果未能解决你的问题,请参考以下文章