获取每组的最新n条记录

时间:2016-07-22 20:49:28

标签: mysql sql greatest-n-per-group

假设我有下表:

id  coulmn_id  value    date
1      10      'a'     2016-04-01
1      11      'b'     2015-10-02
1      12      'a'     2016-07-03
1      13      'a'     2015-11-11
2      11      'c'     2016-01-10
2      23      'd'     2016-01-11
3      11      'c'     2016-01-09
3      111     'd'     2016-01-11
3      222      'c'     2016-01-10
3      333      'd'     2016-01-11

对于n = 3,我想获得每个id的最新n条记录< = 3。所以我将得到以下输出:

id  column_id  value    date
1      10        'a'     2016-04-01
1      12        'a'     2016-07-03
1      13        'a'     2015-11-11
2      11        'c'     2016-01-10
2      23        'd'     2016-01-11
3      111       'd'     2016-01-11
3      222       'c'     2016-01-10
3      333       'd'     2016-01-11

2 个答案:

答案 0 :(得分:4)

我正在回答,因为引用的问题答案不稳定(我会在那里发表评论)。

这是一个应该有效的解决方案:

select t.*
from (select t.*,
             (@rn := if(@id = id, @rn + 1,
                        if(@id := id, 1, 1)
                       )
             ) as seqnum
      from t cross join
           (select @rn := 0, @id := -1) params
      order by id, date desc
     ) t
where seqnum <= 3;

解决方案的不同之处在于变量赋值都在一个表达式中。 MySQL不保证表达式的评估顺序,因此如果代码能够一致地工作,这非常重要。

答案 1 :(得分:0)

您可以使用变量来完成此操作。首先以相反的顺序查看结果并分配行号,然后过滤行数小于或等于3的结果,并重新排序:

select   id, value, date
from     (
           select      id, value, date,
                       @rn := if(@id = id, @rn+1, if (@id := id, 1, 1)) rn
           from        mytable,
           cross join  (@id := null, @rn := null) init
           order by    id, date desc
         ) as base
where    rn <= 3
order by id, date asc