解析函数 - 使用 LAG() 比较值
Analytic function - Comparing values using LAG()
假设以下数据:
| 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 表示比较同一日期时发生了变化。
您需要使用 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;
假设以下数据:
| 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 表示比较同一日期时发生了变化。
您需要使用 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;