天天看點

Oracle 分析函數Merge 案例

-- Start

假設現在有下面這個表用來存放股票的價格,我們需要儲存一個月的曆史記錄。

CREATE TABLE price_history
(
    security_id    NUMBER(10, 0),
    price          NUMBER(10, 4),
    price_date     DATE,
	rank           NUMBER(2, 0)
);
           

由于這個表的資料量非常大,導緻我們想取最新的價格非常慢,于是我們有下面這個表存放最新價格。

CREATE TABLE price
(
    security_id    NUMBER(10, 0),
    price          NUMBER(10, 4)
);
           

現在問題來了,怎麼把 price_history 的最新價格搞到 price 表裡呢?也許你想說根據 price_date,但是 price_date 并不一定是目前日期,而且我們還需要根據 rank 排序,怎麼辦?實在不行,一條一條處理?來吧,是時候展現 Oracle 強大功能的時候了。

MERGE INTO price p
USING (
  SELECT security_id, price FROM (
    SELECT
      ROW_NUMBER() OVER(PARTITION BY security_id ORDER BY price_date DESC, rank DESC) AS ROW_ID,
      security_id,
      price
    FROM
      price_history
  ) WHERE ROW_ID = 1
) ph
ON (p.security_id = ph.security_id)  
WHEN MATCHED THEN UPDATE SET p.price = ph.price
WHEN NOT MATCHED THEN INSERT VALUES (ph.security_id, ph.price);
           

怎麼樣?沒看懂?點選此處檢視更多詳情  Oracle merge 語句 和 Oracle 分析函數。

--更多參見:Oracle SQL 精萃

-- 聲明:轉載請注明出處

-- Last edited on 2015-02-14

-- Created by ShangBo on 2015-02-14

-- End