我有一个包含列的表:FILING_ID
、DATE
和BLAH
我正在尝试编写一个查询,对于每个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查询以检索每个用户的最新记录