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