2013-04-29 41 views
6

Last_value chức năng cửa sổ doesn't hoạt động bình thường.Chức năng cửa sổ Last_value không hoạt động chính xác

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; 

Khi tôi sử dụng LAST_VALUE sau đó tôi nhận được hàng sau:

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

Khi tôi sử dụng FIRST_VALUE hàng sau đó tôi nhận được như sau:

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 truy vấn cho đầu ra chính xác. Tôi hy vọng sẽ có được kết quả tương tự từ các truy vấn này. Tại sao tôi có 2 different results?

+0

này áp dụng cho ** Microsoft SQL Server ** cũng – Jaider

Trả lời

5

first_valuelast_value hơi đặc biệt ở chỗ chúng yêu cầu cửa sổ để hoạt động.

Bạn cần phải thêm ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING như sau:

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; 

Xem tài liệu: http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions001.htm#i81407 và đọc đặc biệt là phần trên cửa sổ. Không phải là mệnh đề mặc định cho các hàm chấp nhận mệnh đề cửa sổ là RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW, giải thích tại sao một thứ tự hoạt động trong khi mệnh lệnh kia lại không hoạt động!

9

Trong các chức năng phân tích, bạn cần xác định phạm vi cửa sổ. Theo mặc định, nó là between unbounded preceding and current row, mà tôi cho là tự giải thích.

Về cơ bản, đây là những gì sẽ xảy ra khi bạn chỉ định partition by customer_id order by valid_from asc:

  1. Oracle mất tất cả các hàng phù hợp với hiện tại hàng của customer id
  2. Nó ra lệnh cho chúng trong một thứ tự tăng dần bởi valid_from
  3. Nó tạo thành một cửa sổ bắt đầu với tối thiểu valid_from ngày và kết thúc bằng hàng hiện tại là valid_from.
  4. Nó đánh giá last_value, trả về hàng hiện tại của bạn là valid_from.

Những gì bạn cần làm là xác định một loạt đang diễn ra:

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 
Các vấn đề liên quan