对于某个groupid列的每个唯一值,如何获取最后3个日期的行



我有一个包含列的表:FILING_IDDATEBLAH

我正在尝试编写一个查询,对于每个FILING_ID,返回具有最后三个日期的行。如果表格为:

   FILING_ID   DATE    
     aksjdfj   2/1/2006
           b   2/1/2006
           b   3/1/2006
           b   4/1/2006
           b   5/1/2006

我想要:

   FILING_ID   DATE    
     aksjdfj   2/1/2006
           b   3/1/2006
           b   4/1/2006
           b   5/1/2006

我想运行一些查询,找出每个FILING_ID的第三高日期,然后进行连接,并将截止日期与DATE进行比较?

我使用PostgreSQL。有没有办法使用限制?

SELECT filing_id, date  -- more columns?
FROM  (
   SELECT *, row_number() OVER (PARTITION BY filing_id ORDER BY date DESC NULLS LAST) AS rn
   FROM   tbl
   ) sub
WHERE  rn < 4
ORDER  BY filing_id, date;  -- optionally order rows

只有当date实际上可以为NULL时,NULLS LAST才相关
如果date不是唯一的,您可能需要打破联系才能获得稳定的结果。

  • PostgreSQL按日期时间asc排序,先为null
  • 选择每个GROUP BY组中的第一行

有没有办法使用限制?

也许吧。如果您有一个额外的表,其中包含所有不同的filing_id(可能还有更多的表,它们被联接删除),则可以使用CROSS JOIN LATERAL, LATERAL是短语法):

SELECT f.filing_id, t.*
FROM   filing f  -- table with distinct filing_id
     , LATERAL (
   SELECT date -- more columns?
   FROM   tbl
   WHERE  filing_id = f.filing_id
   ORDER  BY date DESC NULLS LAST
   LIMIT  3  -- now you can use LIMIT
   ) t
ORDER  BY f.filing_id, t.date;
  • LATERAL和PostgreSQL中的子查询有什么区别

如果没有filing表,可以创建一个。或者在飞行中得到它:

  • 优化GROUP BY查询以检索每个用户的最新记录

最新更新