11

Last_valueウィンドウ機能doesn'tは正常に動作します。

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_VALUEと、次の行が得られます。

06.04.2013 20:34:00
06.04.2013 01:34:16
12.04.2013 11:07:01

使用するFIRST_VALUEと、次の行が得られます。

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

First_valueクエリは正しい出力を提供します。これらのクエリから同じ出力を得たいと思っていました。なぜ私は持っているの2 different resultsですか?

4

2 に答える 2

14

分析関数では、ウィンドウ範囲を指定する必要があります。デフォルトでは です。これはbetween unbounded preceding and current row自明だと思います。

を指定すると、基本的には次のようになりますpartition by customer_id order by valid_from asc

  1. Oracleは現在の行に一致するすべての行を取得しますcustomer id
  2. によって昇順で並べ替えます。valid_from
  3. 最小valid_from日付で始まり、現在の行で終わるウィンドウを形成しますvalid_from
  4. を評価しlast_value、現在の行の を返しますvalid_from

あなたがする必要があるのは、進行中の範囲を指定することです:

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
于 2013-04-29T08:57:22.913 に答える
9

first_valuelast_value操作するウィンドウが必要な点で少し特殊です。

ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING次のように追加する必要があります。

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;

次のドキュメントを参照してください

ウィンドウ句を受け入れる関数のデフォルトの句はRANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW、ある順序が機能し、他の順序が機能しない理由を説明するものであることに注意してください! ウィンドウを指定せずに累計タイプの計算を簡単に実行できるように、デフォルト句はこのように設定されています。

于 2013-04-29T08:46:16.560 に答える