2016-11-16 97 views
0

我已經寫了一個查詢,以便從BDB選擇*只得到更新的價格值DAY的組合,INST在最新的ACT 我創建的表像的Oracle SQL查詢優化另外1

CREATE TABLE bdb(
    ACT NUMBER(8) NOT NULL, 
    INST NUMBER(8) NOT NULL, 
    DAY DATE  NOT NULL, 
    PRICE VARCHAR2 (3), 
    CURR NUMBER (8,2), 
    PRIMARY KEY (ACT,INST,DAY) 
); 

使用該使用此查詢 我得到的只是一天,INST來填充表

DECLARE 
    t_day bdb.day%type:= '1-JAN-16'; 
    n pls_integer; 
BEGIN 


<<act_loop>> 
FOR i IN 1..3 LOOP --NUMBER OF ACT i 
    <<inst_loop>> 
    FOR j IN 1..1000 LOOP --NUMBER OF INST j 
     t_day:='3-JAN-16'; 
     <<day_loop>> 
     FOR k IN 1..260 LOOP --NUMBER OF DAYS k 
      n:= dbms_random.value(1,3); 
      INSERT into bdb (ACT,INST,DAY,PRICE,CURR) values (i,j,t_day,n,10.3); 
      t_day:=t_day+1; 
     END loop day_loop; 

    END loop inst_loop; 
END loop act_loop; 

END; 
/

,價格

select day,inst,price from bdb where (act=(select max(act) from bdb)) 
minus 
select day,inst,price from bdb where act=(select max(act)-1 from bdb); 

以上是快速的,但我想以有效的方式獲得所有的領域。 一個我想出了有點慢這是本,

select 
    e1.* 
from 
    (select 
     * 
    from 
     bdb 
    where 
     (act=(select max(act) from bdb)) 
    )e1, 
(select day,inst,price from bdb where (act=(select max(act) from bdb)) 
minus 
select day,inst,price from bdb where act=(select max(act)-1 from bdb)) e2 
where 
e1.day=e2.day and e1.inst=e2.inst; 

誰能給任何建議,如何更多的優化呢?或出使用交叉連接兩個表如何獲得所需的output.Help我;)

只是我需要的是

 ACT INST  DAY  PRI CURR 
    ------------------------------------ 
    3 890 05-MAR-16  3  10.3 
    3 890 06-MAR-16  2  10.3 
    3 890 07-MAR-16  2  10.3 

    3 891 05-MAR-16  2  10.3 
    3 891 06-MAR-16  1  10.3 
    3 891 07-MAR-16  2  10.3 

    4 890 05-MAR-16  3  10.3 
    4 890 06-MAR-16  2  10.3 
    4 890 07-MAR-16  1  10.3 

    4 891 05-MAR-16  2  10.3 
    4 891 06-MAR-16  2  10.3 
    4 891 07-MAR-16  1  10.3 

這裏(890,05-MAR-16),(890,06 -MAR-16)(890,06-MAR-16) (891,05-MAR-16)(891,06-MAR-16)(891,06-MAR-16)in act = 3 價格是 3,2,2 2,1,2

but when act=4 happens 
     (890,07-MAR-16) 
     (891,06-MAR-16) 
     (891,07-MAR-16) 
     price values are change from what they were in act=3. 
     others not change 

最終我需要的是

ACT INST  DAY  PRI CURR 
    ------------------------------------ 
    4 890 07-MAR-16  1  10.3 
    4 891 06-MAR-16  2  10.3 
    4 891 07-MAR-16  1  10.3 

回答

0

它看起來像是在一天之後,inst和價格值有一行,其中act列具有整個表中最大的行爲值,但沒有行的行列比最大行爲值小1。

你可以試試這個:

所有的
SELECT day, 
     inst, 
     price 
FROM (SELECT day, 
       inst, 
       price, 
       act, 
       MAX(act) OVER() max_overall_act 
     FROM bdb) 
WHERE act IN (max_overall_act, max_overall_act -1) 
GROUP BY day, inst, price 
HAVING MAX(CASE WHEN act = max_overall_act THEN 1 END) = 1 
AND MAX(CASE WHEN act = max_overall_act - 1 THEN 1 END) IS NULL; 

首先,子查詢發現在整個表中的最高行爲的價值。

然後我們選擇行爲值爲最大值或小於此值的所有行。

之後,我們對行進行分組,找出哪些行具有act = max act val,但沒有act = max act val -1。


然而,從你在你的文章中說:

我已經寫了一個查詢SELECT * FROM BDB只得到更新的價格值DAY的組合,INST在最新ACT

既沒有你提出的查詢,上面的查詢在我的答案中似乎與你之後的結果相符。

我認爲不是,你喜歡的東西后:

SELECT act, 
     inst, 
     DAY, 
     price, 
     curr, 
     prev_price -- if desired 
FROM (SELECT act, 
       inst, 
       DAY, 
       price, 
       curr, 
       LEAD(price) OVER (PARTITION BY inst, DAY ORDER BY act DESC) prev_price, 
       row_number() OVER (PARTITION BY inst, DAY ORDER BY act DESC) rn 
     FROM bdb) 
WHERE rn = 1 
AND prev_price != price; 

這樣做是使用LEAD()分析(基於遞減法量級)找到該行的報價與前期爲每一天和每一天行動,以及行號。

然後,要查找最新的act行,我們只需選擇rownumber爲1的行以及之前的價格與當前價格不匹配的行。如果您願意,您可以顯示當前和以前的價格。

+0

感謝您的快速回復...我想我沒有正確解釋問題....我認爲這將明確闡明它。更新的問題是 – Noah

+0

你的第一個解釋是正確的...但我需要他們與他們的ACT和CURR領域有效的方式 – Noah

+0

道歉;我錯過了我的第二個查詢中的'AND prev_price!= price'條件。這應該現在工作。 – Boneist