Postgresql 是否按顺序获取数据库中的最后N行?

Postgresql 是否按顺序获取数据库中的最后N行?,postgresql,Postgresql,假设我有以下数据库表: record_id | record_date | record_value -----------+-------------+-------------- 1 | 2010-05-01 | 195.00 2 | 2010-07-01 | 185.00 3 | 2010-09-01 | 175.00 4 | 2010-05-01 | 189.

假设我有以下数据库表:

 record_id | record_date | record_value
-----------+-------------+--------------
         1 | 2010-05-01  |       195.00
         2 | 2010-07-01  |       185.00
         3 | 2010-09-01  |       175.00
         4 | 2010-05-01  |       189.00
         5 | 2010-06-01  |       185.00
         6 | 2010-07-01  |       180.00
         7 | 2010-08-01  |       175.00
         8 | 2010-09-01  |       170.00
         9 | 2010-10-01  |       165.00
我想抓取最后5行,其中的数据按record_date ASC排序。这很容易做到:

SELECT * FROM mytable ORDER BY record_date ASC LIMIT 5 OFFSET 4
这将给我:

 record_id | record_date | record_value
-----------+-------------+--------------
         6 | 2010-07-01  |       180.00
         7 | 2010-08-01  |       175.00
         3 | 2010-09-01  |       175.00
         8 | 2010-09-01  |       170.00
         9 | 2010-10-01  |       165.00
但是,当我不知道有多少条记录,也不能计算4的幻数时,我该怎么做呢

我尝试过此查询,但如果记录少于5条,则会导致负偏移量,这是无效的:

SELECT * FROM mytable ORDER BY record_date ASC LIMIT 5 
    OFFSET (SELECT COUNT(*) FROM mytable) - 5;

那么我该如何做到这一点呢?

你为什么不以相反的方式订购呢

SELECT * FROM mytable ORDER BY record_date DESC LIMIT 5;
如果不想在应用程序中正确翻转,可以嵌套查询并翻转两次:

SELECT *
    FROM (SELECT * FROM mytable ORDER BY record_date DESC LIMIT 5)
    ORDER BY record_date ASC;
…这是一个非常便宜的操作。

这应该可以:

WITH t AS (
    SELECT * FROM mytable ORDER BY record_date DESC LIMIT 5
)
SELECT * FROM t ORDER BY record_date ASC;

如果您不想使用订单:

选择*从某物偏移选择countid>10时的大小写,然后选择countid-10从某物结束
对于第一个查询:因为我不想在应用程序中对其进行排序。对于第二个查询:工作得很好,但不适合我的DAL。哦,好吧。谢谢@Travis第二次查询给出了一个错误。在下单之前,嵌套查询后面必须跟一个AS[query\u name]语句BY@AndyStowAway:这可能是实现的一个限制。我相当确定匿名子查询是可以的,我知道它们在Postres和MySQL中工作。我如何用预定义的列来实现这一点?用您想要的列替换任意一个查询中的*。选择哪一个并不重要,查询计划器最终也会做同样的事情。是的,这是对反向操作的一个很好的补充。谢谢