Sql 从表中获取记录?

Sql 从表中获取记录?,sql,postgresql,greatest-n-per-group,Sql,Postgresql,Greatest N Per Group,我有一个数据如下的表 映射关系 1个任务\u id映射到多个任务\u详细信息\u id 1到多个 我想要的是遍历表并获取记录,就像同一个任务id存在2次以上一样,然后获取该任务id的前2条最新记录 样本输出 Task_detail_id Task_id Creation_date 1 20 2020-05-02 20:28:23.354 2 21 2020-05-02 2

我有一个数据如下的表

映射关系

1个任务\u id映射到多个任务\u详细信息\u id 1到多个

我想要的是遍历表并获取记录,就像同一个任务id存在2次以上一样,然后获取该任务id的前2条最新记录

样本输出

Task_detail_id  Task_id         Creation_date
1                 20            2020-05-02 20:28:23.354
2                 21            2020-05-02 20:28:23.354
3                 22            2020-05-02 19:28:23.354
4                 22            2020-05-02 18:28:23.354
8                 23            2020-05-02 10:28:23.354
9                 24            2020-05-02 09:28:23.354
10                24            2020-05-02 08:28:23.354

这通常通过窗口功能完成:

select task_detail_id, task_id, creation_date
from (
  select task_detail_id, task_id, creation_date, 
         row_number() over (partition by task_id order by creation_date desc) as rn
  from data
) t
where rn <= 2
order by task_detail_id, task_id;

只标记您使用的数据库。我正在使用PostgreSql向我们展示一些示例表数据和预期结果-所有内容都是格式化文本,而不是图像。请看一下为什么任务ID 20和21在输出中?它们只存在一次,不超过2次。上面的解决方案是返回所有行。i:e它与样品不匹配output@Sam:抱歉,应按任务\u id进行分区
select task_detail_id, task_id, creation_date
from (
  select task_detail_id, task_id, creation_date, 
         row_number() over (partition by task_id order by creation_date desc) as rn
  from data
) t
where rn <= 2
order by task_detail_id, task_id;