-- 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