【问题标题】:SQL - Setting values with looped executionSQL - 通过循环执行设置值
【发布时间】:2020-11-29 17:54:07
【问题描述】:

我想测试一些股票交易策略,并试图弄清楚我可以多么容易地使用 SQL (mySQL) 创建计算字段,而不是像以前那样使用 Python 使用 MongoDB。

我有大约 3,000 个股票代码的 5 年数据,我希望能够根据需要进行试验和设置其他列。这对于 Python/MongoDB 来说可能是一个相当缓慢的过程,而 pandas 在逐个代码的基础上计算和设置值方面非常直观,我想如果我能在SQL(我真的需要在 SQL 方面做得更好)。 SQL 的体积也比 MongoDB 小,而且我最终可能会得到大量的计算字段。

具体来说,我必须执行以下操作:

  1. 根据表中不同的股票代码值创建一个数组。
  2. 遍历数组并按股票代码执行。
  3. 每个循环只需要选择与每个代码相关的行,然后执行需要引用多行的计算(例如,可以通过查找连续行上两个“关闭”字段之间的百分比变化来计算“更改”字段.

我在这里发现了一些表明我可以做 #3 的事情:SQL difference between rows

我想我只需要更改该查询以仅选择某个股票代码,但我真的不确定我是否可以执行 #1 和 #2。我看到我可以创建一个数组,但我不确定如何为数据库中的唯一值动态地执行此操作。对于#2,我发现可以创建while 循环,但不能创建for 循环(尽管可能有一些方法可以将while 循环用作for 循环)。

我想如果我获得第一名,我可以得到其余的,但任何建议都会受到赞赏。还有任何关于在 SQL 中执行此操作是否有意义的一般反馈。

【问题讨论】:

  • 您可能可以在 SQL 中做您想做的事,但不是您描述的方式。首先,MySQL 没有原生的“数组”数据类型。它根本不是语言的一部分。我建议你问一个新的问题。提供样本数据、期望的结果以及您想要记住的一两个或三个代表性计算的解释。这将提供如何在 SQL 中表达逻辑的示例。
  • 我想我可以得到不同代码的计数,找到与循环迭代对应的第 n 个代码,并相应地执行计算。知道这在速度方面与 Python 相比如何吗?
  • 因为 python 是最慢的语言之一,所以除非你做的事情非常低效,否则它总是比 python 快....
  • 我用逗号分隔值的字符串代替了真正的数组,它就是这样工作的。我仍然需要添加上面 #3 中提到的行迭代计算来测试速度方面。

标签: python mysql sql mongodb


【解决方案1】:

这只是一个基本示例,其中字段Test 是根据不同代码值内的代码索引设置的。诀窍是在字符串中使用逗号分隔的值来模拟数组,然后遍历字符串。

DROP PROCEDURE IF EXISTS set_fields;
DELIMITER //
CREATE PROCEDURE set_fields()
    BEGIN
        /* Get ticker count (for WHILE loop max iterations) and comma-separated tickers */
        SET @tickerCount = (
            SELECT COUNT(DISTINCT Ticker) FROM price_history
        );
        SET @tickers = (
            SELECT GROUP_CONCAT(Ticker) FROM (
                SELECT DISTINCT v.Ticker
                FROM price_history AS v
            ) as Tickers
        );
        SET @i = 0;
        
        WHILE @i < @tickerCount DO
            /* Loop through tickers in @tickers and call UPDATE */
        
            SET @comma = POSITION(',' IN @tickers);
            
            IF @comma = 0 THEN
                SET @ticker = @tickers;
            ELSE
                SET @ticker = SUBSTRING(@tickers, 1, @comma-1);
                SET @tickers = SUBSTRING(@tickers, @comma+1);
            END IF; 
            
            UPDATE price_history SET Test = @i WHERE Ticker = @ticker;
            SET @i = @i + 1;

        END WHILE;
        
    END //
DELIMITER ;

CALL set_fields();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    相关资源
    最近更新 更多