天天看点

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