首页 > 解决方案 > MySQL LN 带除法

问题描述

在 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;

标签: mysql

解决方案


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

在子查询中使用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

推荐阅读