2013-04-29 16 views
6

Last_value funkcja okna doesn't działa poprawnie.Funkcja okna Last_value nie działa poprawnie

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; 

Gdy używam LAST_VALUE potem się następujące wiersze:

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

Gdy używam FIRST_VALUE potem się następujące wiersze:

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 kwerendy daje poprawny wynik. Miałem nadzieję uzyskać te same wyniki z tych zapytań. Dlaczego mam 2 different results?

+0

Dotyczy to ** ** Microsoft SQL Server, a także – Jaider

Odpowiedz

5

first_value i last_value są nieco wyjątkowe, ponieważ wymagają okna do obsługi.

Trzeba dodać ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING następująco:

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; 

Zobacz dokumentację: http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions001.htm#i81407 i czytać zwłaszcza sekcję okienkowanie. Nie oznacza to, że domyślną klauzulą ​​dla funkcji akceptujących klauzulę okienniczą jest RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW, co wyjaśnia, dlaczego jedno zamówienie działa, a drugie nie!

9

W funkcjach analitycznych należy określić zakres okna. Domyślnie jest to between unbounded preceding and current row, co zakładam, że nie wymaga objaśnień.

Zasadniczo, jest to, co się dzieje, gdy podasz partition by customer_id order by valid_from asc:

  1. Oracle wykonuje wszystkie wiersze pasujące bieżący wiersz na customer id
  2. To porządkuje je w kolejności rosnącej przez valid_from
  3. Tworzy okno zaczynając minimalna valid_from data i kończąca się bieżącym wierszem: valid_from.
  4. Wylicza on wartość last_value, która zwraca bieżący wiersz: valid_from.

Co trzeba zrobić, to określić bieżącą ofertą:

16:53:00 [email protected]> 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 [email protected]>/

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 
Powiązane problemy