Oracle 最后一个值窗口函数没有';我不能正常工作
Oracle 最后一个值窗口函数没有';我不能正常工作,oracle,window-functions,Oracle,Window Functions,Last\u值窗口功能无法正常工作 CREATE TABLE EXAMP2 ( CUSTOMER_ID NUMBER(38) NOT NULL, VALID_FROM DATE NOT NULL ); Customer_id Valid_from ------------------------------------- 9775 06.04.
Last\u值
窗口功能无法正常工作
CREATE TABLE EXAMP2
(
CUSTOMER_ID NUMBER(38) NOT NULL,
VALID_FROM DATE NOT NULL
);
Customer_id Valid_from
-------------------------------------
9775 06.04.2013 01:34:16
9775 06.04.2013 20:34:00
9775 12.04.2013 11:07:01
--------------------------------------
select DISTINCT LAST_VALUE(VALID_FROM)
OVER (partition by customer_id ORDER BY VALID_FROM ASC) rn
from examp1;
当我使用LAST\u值时,我得到以下行:
06.04.2013 20:34:00
06.04.2013 01:34:16
12.04.2013 11:07:01
select DISTINCT FIRST_VALUE(VALID_FROM)
OVER (partition by customer_id ORDER BY VALID_FROM DESC) rn
from examp1;
4/12/2013 11:07:01 AM
当我首先使用值时,我会得到以下行:
06.04.2013 20:34:00
06.04.2013 01:34:16
12.04.2013 11:07:01
select DISTINCT FIRST_VALUE(VALID_FROM)
OVER (partition by customer_id ORDER BY VALID_FROM DESC) rn
from examp1;
4/12/2013 11:07:01 AM
第一个\u值
查询给出正确的输出。我希望从这些查询中得到相同的结果。为什么我有两个不同的结果
?第一个值
和最后一个值
有点特殊,因为它们需要一个窗口来操作
您需要在无界前向行和无界后向行之间添加,如下所示:
select DISTINCT LAST_VALUE(VALID_FROM) OVER (partition by customer_id
ORDER BY VALID_FROM ASC
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) rn
from examp1;
请参阅文档:并特别阅读有关窗口的部分
请注意,接受windowing子句的函数的默认子句是介于无界的前一行和当前行之间的范围
,这解释了为什么一个命令有效,而另一个命令无效!通过这种方式设置default子句,可以轻松执行总计类型计算,而无需指定窗口。在分析函数中,您需要指定窗口范围。默认情况下,它是在无界的前一行和当前行之间的,我认为这是不言自明的
基本上,当您从asc指定按客户id顺序按有效顺序划分时会发生这种情况
:
Oracle获取与当前行的客户id匹配的所有行
它从
valid\u开始,从
日期起以当前行的valid\u结束
last\u值
,该值从返回当前行的有效值
16:53:00 SYSTEM@sandbox> ed
Wrote file S:\spool\sandbox\BUFFER_SYSTEM_38.sql
1 select last_value(VALID_FROM) OVER (
2 partition by customer_id
3 ORDER BY VALID_FROM asc
4 range between current row and unbounded following
5 ) rn
6* from t
16:53:21 SYSTEM@sandbox> /
RN
---------------------------------------------------------------------------
04-DEC-13 11.07.01.000000 AM
04-DEC-13 11.07.01.000000 AM
04-DEC-13 11.07.01.000000 AM
Elapsed: 00:00:00.01
这适用于Microsoft SQL Server aswell@Jaider它适用于大多数RDBMS,因为它在SQL标准中是这样定义的。我想补充一点,与这一规则不同的是,它也有同样的行为