我在 Ubuntu 上使用 MySQL 5.5 版。
我的数据库表设置如下:
DDL: 创建表'asx'( '代码' char(3) NOT NULL, '高'十进制(9,3), '低'十进制(9,3), '关闭'十进制(9,3), 'histID' int(11) NOT NULL AUTO_INCREMENT, 主键('histID'), 唯一键“代码”(“代码”) ) 创建表'asxhist'( '日期' 日期不为空, '平均'十进制(9,3), 'histID' int(11) 非空, 主键('日期','histID'), KEY 'histID' ('histID'), 约束“asxhist_ibfk_1”外键(“histID”)参考“asx”(“histID”) 更新级联 ) t1: | 代码 | 高 | 低 | 关闭 | histID(主键)| | 阿克斯 | 10.000 | 9.500 | 9.800 | 1 | 抓住 | 42.000 | 41.250 | 41.350 | 2 t2: | 日期 | 平均 | histID (外键) | | 2013-01-01| 10.000 | 1 | | 2013-01-01| 39.000 | 2 | | 2013-01-02| 9.000 | 1 | | 2013-01-02| 38.000 | 2 | | 2013-01-03| 9.500 | 1 | | 2013-01-03| 39.500 | 2 | | 2013-01-04| 11.000 | 1 | | 2013-01-04| 38.500 | 2 | 我正在尝试完成一个产生此结果的选择查询: | 代码 | 高 | 低 | 关闭 | asxhist.average | | 阿克斯 | 10.000 | 9.500 | 9.800 | 11.000, 9.5000 | | 抓住 | 42.000 | 41.250 | 41.350 | 38.500,39.500 |
表 2 中的最新信息与表 1 以 csv 格式返回。我设法做到了这一点:
SELECT code, high, low, close,
(SELECT GROUP_CONCAT(DISTINCT t2.average ORDER BY date DESC SEPARATOR ',') FROM t2
WHERE t2.histID = t1.histID)
FROM t1;
不幸的是,这会返回与 hID 关联的所有值。我正在查看 xaprb.com 的 firstleastmax-row-per-group-in-sql 解决方案,但我整天都在敲我的头,轻微的头晕似乎正在削弱我理解我应该如何使用它的能力益处。如何将结果限制为最近的 5 个值,并考虑到表的大小最终将是兆字节,尝试保持在 O(n 2 ) 或更少?(或者我可以吗?)