汇总数据使用sql

时间:2018-06-23 12:42:01

标签: mysql sql

这是“交易所” table的定义:

CREATE TABLE `exchange` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `rank` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `volume` varchar(255) NOT NULL,
  `timestamp` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=75032 DEFAULT CHARSET=utf8;

每5分钟将存储大约209条记录。

如何获取此数据结构?

rank, name, [volume,...](last 144 value), timestamp

我使用以下查询:

SELECT `volume`
FROM `exchange`
WHERE `exchange`.`name` = 'binance'
ORDER BY `timestamp` DESC
LIMIT 144

是否有更好的方法可以一次获取数据?谢谢。

1 个答案:

答案 0 :(得分:0)

坦率地说,您的方法可能是最好的方法,尤其是如果您在(name, timestamp)上有索引。

您可以尝试:

select e.volume
from exchange e
where e.timestamp >= (select e2.timestamp
                      from exchange e2
                      where e2.name = e.name
                      limit 1 offset 143
                     );

然后您可以将这些值汇总为:

select e.name, sum(e.volume)
from exchange e
where e.timestamp >= (select e2.timestamp
                      from exchange e2
                      where e2.name = e.name
                      limit 1 offset 143
                     )
group by e.name;

注意:在MySQL 8+中,使用row_number()更简单:

select name, sum(volume)
from (select e.*,
             row_number() over (partition by name order by timestamp desc) as seqnum
      from exchange e
     ) e
where seqnum <= 144
group by name;