postgresql – 按顺序获取数据库中的最后N行?

假设我有以下数据库表:
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

我想使用record_date ASC排序的数据来抓取最后5行。这很容易做到:

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条记录,则会产生一个负的OFFSET,这是无效的:

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;

…结果是一个相当便宜的操作。

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...