我正在尝试为我的桌子构建个性化查询,其中包括为每个人获取最新的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值。你能帮助我吗?
答案 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
它运作良好。谢谢大家的贡献!