获取每个人的最新N个结果

时间:2014-05-29 18:49:02

标签: mysql greatest-n-per-group

我正在尝试为我的桌子构建个性化查询,其中包括为每个人获取最新的N条记录。我的表架构如下:

+-----------+---------------------+------+-----+---------+-------+
| Field     | Type                | Null | Key | Default | Extra |
+-----------+---------------------+------+-----+---------+-------+
| person    | varchar(100)        | NO   | PRI | NULL    |       |
| time      | bigint(20) unsigned | NO   | PRI | NULL    |       |
+-----------+---------------------+------+-----+---------+-------+

例如,如果我有以下数据:

+---------+-------+
| person  | time  |
+---------+-------+
| A       | 2     |
| A       | 7     |
| B       | 1     |
| B       | 6     |
| B       | 4     |
| C       | 3     |
+---------+-------+

和我的N = 2,预期结果为:

+---------+-------+
| person  | time  |
+---------+-------+
| A       | 7     |
| A       | 2     |
| B       | 6     |
| B       | 4     |
| C       | 3     |
+---------+-------+

(每个人最后2个结果,按人asc排序,时间desc)

我知道我可以先获取所有人名并逐个选择/订购/限制它们,但我很想知道我是否可以在一个查询中对此进行操作,并让DBMS做出艰苦的工作。对于N = 1,我成功使用了max和group by语句:

SELECT person, max(time) as time FROM table GROUP BY person ORDER BY person ASC, time DESC

但是我不知道如何扩展它以获得更高的N值。你能帮助我吗?

1 个答案:

答案 0 :(得分:0)

好的,我使用@Rudie链接找到了解决方案:

select * from (
    select a.* from points as a
    left join points as a2
    on a.person= a2.person and a.time <= a2.time
    group by person, time
    having count(*) <= 2) a
order by person asc, time desc;

实例:http://sqlfiddle.com/#!2/58026/2

它运作良好。谢谢大家的贡献!