MYSQL - 选择每个股票组的最新3条记录

时间:2014-06-19 16:25:07

标签: mysql

股票数据

ticker  date         open   high    low     close   volume
--------------------------------------------------------------
AAA     2014-06-16   0.9    0.9     0.89    0.895   542
AAA     2014-06-15   1.32   1.33    1.31    1.32    2792
AAA     2014-06-14   1.19   1.25    1.19    1.25    417
AAA     2014-06-13   0.715  0.715   0.705   0.71    36526

BBB     2014-06-16   0.9    0.9     0.89    0.895   542
BBB     2014-06-15   1.32   1.33    1.31    1.32    2792
BBB     2014-06-14   1.19   1.25    1.19    1.25    417
BBB     2014-06-13   0.715  0.715   0.705   0.71    36526

CCC     2014-06-16   0.9    0.9     0.89    0.895   542
CCC     2014-06-15   1.32   1.33    1.31    1.32    2792
CCC     2014-06-14   1.19   1.25    1.19    1.25    417
CCC     2014-06-13   0.715  0.715   0.705   0.71    36526

我想选择每个股票的最新3条记录,以便它会像上面那样从上表中返回下面的行;

AAA     2014-06-16   0.9    0.9     0.89    0.895   542
AAA     2014-06-15   1.32   1.33    1.31    1.32    2792
AAA     2014-06-14   1.19   1.25    1.19    1.25    417

BBB     2014-06-16   0.9    0.9     0.89    0.895   542
BBB     2014-06-15   1.32   1.33    1.31    1.32    2792
BBB     2014-06-14   1.19   1.25    1.19    1.25    417

CCC     2014-06-16   0.9    0.9     0.89    0.895   542
CCC     2014-06-15   1.32   1.33    1.31    1.32    2792
CCC     2014-06-14   1.19   1.25    1.19    1.25    417

1 个答案:

答案 0 :(得分:3)

您可以使用用户定义的变量对每个股票代码组的每个记录进行排名,而在外部选择只按级别过滤它们

SELECT t.* FROM (
SELECT s.*,
@rank:= CASE WHEN @group = s.ticker THEN @rank +1 ELSE 1 END rank ,
@group:= s.ticker g
 FROM
`stock` s
JOIN (SELECT @group:='',@rank:='') t
ORDER BY ticker  ,`date` DESC
) t WHERE t.rank <=3