【问题标题】:Fetch record from table?从表中获取记录?
【发布时间】:2020-08-22 13:39:06
【问题描述】:

我有一个表格,其中的数据是这样的

映射关系

1 个 task_id 映射到多个 task_detail_id(1 到多个

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
5                22         2020-05-02 17:28:23.354
6                22         2020-05-02 16:28:23.354
7                22         2020-05-02 15: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
11               24         2020-05-02 07:28:23.354

我想要的是遍历表并获取记录,就好像 相同的 task_id 存在超过 2 次,然后获取该 task_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

【问题讨论】:

  • 只标记您使用的数据库。
  • 我正在使用 Postgresql
  • 向我们展示一些示例表数据和预期结果 - 都是格式化文本,而不是图像。 (minimal reproducible example)
  • 请看一下
  • 为什么 task_ids 20 和 21 在输出中?它们只存在一次,而不是“超过 2 次”。

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


【解决方案1】:

这通常使用窗口函数来完成:

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;

Online example

【讨论】:

  • 以上解决方案是返回所有行。 i:e 与样本输出不匹配
  • @Sam:对不起,应该是partition by task_id
猜你喜欢
  • 1970-01-01
  • 2016-08-04
  • 2013-06-14
  • 2018-01-25
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多