【问题标题】:MySQL Query Optimization to calculate Periodic-Rate-of-Return between 2 recordsMySQL 查询优化以计算 2 条记录之间的 Periodic-Rate-of-Return
【发布时间】:2016-09-26 04:45:27
【问题描述】:

我开始工作的以下查询计算了两条记录之间的周期性回报率。我不知道如何编写这个逻辑,所以它会针对给定的代码在整个表中运行。任何指导将不胜感激。

SELECT 
   (SELECT closeprice FROM marketdata.nyse
    WHERE ticker = 'DDD' and
    eoddate < 20150113 order by eoddate desc limit 1) as `cp_t1`
,closeprice as `cp_t0`
, log(
        closeprice /
        (SELECT closeprice FROM marketdata.nyse
            WHERE ticker = 'DDD' and
            eoddate < 20150113 order by eoddate desc limit 1) 
        ) as PRoR
FROM marketdata.nyse
WHERE ticker = 'DDD' and
eoddate = 20150113;

它正在返回我想要的和期望的。

cp_t1               cp_t0   PRoR
31.360000610351562  30.88   0.02392378745852884

我的桌子设计如下。

tick_id, name, ticker, eoddate, openprice, highprice, lowprice, closeprice, volume, pror, prorpct
1, 3D Systems Corp, DDD, 2015-01-01, 32.87, 32.87, 32.87, 32.87, 0, , 
2, 3D Systems Corp, DDD, 2015-01-02, 32.98, 33.97, 31.89, 32.42, 2571900, , 
3, 3D Systems Corp, DDD, 2015-01-05, 31.99, 32, 30.3, 30.74, 2890500, , 
4, 3D Systems Corp, DDD, 2015-01-06, 30.85, 31.38, 29.26, 30.15, 2967500, , 
5, 3D Systems Corp, DDD, 2015-01-07, 30.4, 31.22, 30.2, 30.88, 2145000, , 
6, 3D Systems Corp, DDD, 2015-01-08, 31.37, 32.73, 30.83, 32.32, 2988300, , 

【问题讨论】:

  • 查看 MariaDB 10.2 的 Windowing functions
  • 有趣。我没有使用过 MariaDB。我会仔细看看的。谢谢。

标签: mysql sql performance


【解决方案1】:

我必须学习如何编写存储过程来实现我的目标。代码如下:

CREATE DEFINER=`ericg`@`%` PROCEDURE `calcPRoR`(IN symbol varchar(7))
BEGIN

DECLARE _output TEXT DEFAULT '';
DECLARE done, inner_done INT DEFAULT 0;
DECLARE c_tick_id INT;
DECLARE c_name VARCHAR(75);
DECLARE c_ticker VARCHAR(7);
DECLARE c_eoddate DATE;
DECLARE c_openprice, c_highprice, c_lowprice, c_closeprice, c_inner_closeprice, c_pror, c_prorpct FLOAT;
DECLARE c_volume INT(18);
DECLARE cursor_var CURSOR FOR SELECT tick_id, name, ticker, eoddate, openprice, highprice, lowprice, closeprice, volume FROM marketdata.marketdata WHERE ticker = symbol;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

OPEN cursor_var;

cursor_var_loop: LOOP
 FETCH cursor_var INTO c_tick_id, c_name, c_ticker, c_eoddate, c_openprice, c_highprice, c_lowprice, c_closeprice, c_volume;


 -- cursor loop statements
 INNER_BLOCK: BEGIN
    DECLARE inner_cursor_var CURSOR FOR SELECT closeprice FROM marketdata.marketdata WHERE ticker = c_ticker and eoddate < c_eoddate order by eoddate desc limit 1;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET inner_done = 1;

    OPEN inner_cursor_var;

    inner_cursor_var_loop: LOOP
        FETCH inner_cursor_var INTO c_inner_closeprice;

        -- inner cursor statements
        SET c_pror      := c_closeprice - c_inner_closeprice;
        SET c_prorpct   := log(c_closeprice / c_inner_closeprice);

        -- output to screen for debugging
        SET _output     = CONCAT(c_eoddate,", ",c_closeprice,", ",c_inner_closeprice,", ",c_pror,", ",c_prorpct);
        SELECT _output;

        IF (inner_done = 1) THEN
            LEAVE inner_cursor_var_loop;

        END IF;
    END LOOP inner_cursor_var_loop;

    CLOSE inner_cursor_var;
 END INNER_BLOCK;   


 IF (done = 1) THEN
        LEAVE cursor_var_loop;
 END IF;
END LOOP;

CLOSE cursor_var;

END

【讨论】:

    猜你喜欢
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多