select a.*,
last_value(Status) over (partition by con_number, con_version order by CREATED_DATE asc) LTST_Status,
first_value(Status) over (partition by con_number, con_version order by CREATED_DATE asc) FIRST_Status
from my_table a
输出我的结果:
CON_NUMBER CON_VERSION STATUS CREATED_DATE LTST_STATUS FIRST_Status
2786182955 1 異動手続完了 2014/6/19 14:16 異動手続完了 異動手続完了
2786182955 2 異動手続き中 2015/3/23 12:37 異動手続き中 異動手続き中
2786182955 2 異動手続完了 2015/4/3 16:05 異動手続完了 異動手続き中
我的问题是当我使用2个函数last_value
和first_value
时。
分区是在CON_NUMBER和CON_VERSION上进行的,因此,LTST_STATUS的输出应该是异动手続完了,FIRST_Status的输出对于CON_VERSION = 2的行应该是异动手続き中,不是吗?
你能解释一下这种行为吗?我做错了吗?
答案 0 :(得分:3)
文档中描述了这一点 - 请研究此链接 - 标题"分析条款/ ROWS |下的章节。范围" (在文件末尾)
http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions004.htm#SQLRF06174
你可以在那里找到一个简短的句子:
如果您完全省略windowing_clause ,则默认为RANGE 在无限制的前进和现在的行之间。
如果对分析函数应用 ORDER BY 子句,对于大多数函数,可以使用窗口规范(有一些例外 - 取决于具体函数,请参阅函数文档) - 如果你省略windows specyfication,那么Oracle使用默认值:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
请尝试此查询,您会发现不同之处:
select a.*,
last_value(Status) over (
partition by con_number, con_version order by CREATED_DATE asc)
LTST_Status,
last_value(Status) over (
partition by con_number, con_version order by CREATED_DATE asc
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
LTST_Status1,
first_value(Status) over (
partition by con_number, con_version order by CREATED_DATE asc)
FIRST_Status
from my_table a