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标准中是这样定义的。我想补充一点,与这一规则不同的是,它也有同样的行为