【问题标题】:MySQL LN with DivisionMySQL LN 带除法
【发布时间】:2023-04-09 00:27:02
【问题描述】:

在 MySQL 5.7 中,我试图计算加密货币的每日回报。这个计算是LN(Day2Close/Day1Close)

我的表结构如下。 CoinIndex 包括每个硬币中的天数。所以BTC数据第一天的coinIndex为1,ETH数据的第一天coinIndex也为1。每天都有数据。:

CREATE TABLE `histoday2` (
 `id` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
 `coinId` mediumint(7) DEFAULT NULL COMMENT 'Crypto Compare CoinID',
 `time` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL,
 `fsym` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL,
 `tsym` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL,
 `close` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
 `high` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
 `low` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
 `open` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
 `volumefrom` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
 `volumeto` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
 `coinIndex` int(11) DEFAULT NULL,
 `totalReturn` decimal(6,2) DEFAULT NULL,
 UNIQUE KEY `id` (`id`)
)

我的查询抛出 LN() 只能包含一个操作数的错误。我不确定如何构造这个查询:

SELECT coinId, time, close, 
(SELECT close, LN(A.close/close) 
FROM histoday2 
WHERE coinIndex = A.coinIndex -1 
AND coinId = A.coinId) B 
FROM histoday2 A;

【问题讨论】:

  • 请编辑您的问题以显示(作为文本,而不是图像)show create table histoday2; 的输出;这更有帮助。
  • 这取决于您所拥有的内容,因此请提供一些示例数据dbfiddle.uk/…
  • 你得到的确切错误是什么?你确定你显示的查询有这个错误吗?
  • @ysth 上面添加的结构。确切的错误是#1241 - Operand should contain 1 column(s)
  • 你只有一个操作数。如果您改为写 LN(a.close, close),则会收到该错误。

标签: mysql


【解决方案1】:

您不能使用将两列作为表达式返回的子查询。子查询表达式最多只能返回一行和一列。

使用JOIN 而不是在子查询中返回前一天的收盘价和LN。

SELECT a.coinid, a.time, a.close AS close_yesteday, b.close AS close_today, LN(a.close/b.close) AS return_rate
FROM histoday2 AS a
JOIN histoday2 AS b ON a.coinid = b.coinid AND a.coinIndex = b.coinIndex - 1

【讨论】:

    【解决方案2】:

    我会使用左连接,以防前一天不存在...

    SELECT
      A.coinId,
      A.time,
      A.close,
      B.close   AS previousClose,
      LN(A.close/B.close) AS xxx
    FROM
      histoday2 A
    LEFT JOIN
      histoday2 B
        ON  B.coinIndex = A.coinIndex - 1
        AND B.coinID    = A.coinID
    

    Dbfiddle here

    【讨论】:

      猜你喜欢
      • 2014-04-25
      • 2017-06-27
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-18
      • 2013-03-12
      • 2013-03-26
      相关资源
      最近更新 更多