【问题标题】:Get the last N rows in the database in order?按顺序获取数据库中的最后N行?
【发布时间】:2019-12-14 02:59:37
【问题描述】:

假设我有以下数据库表:

 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

我想使用按记录日期 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;

那么我该如何实现呢?

【问题讨论】:

    标签: postgresql


    【解决方案1】:

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

    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;
    

    ...事实证明这是一个非常便宜的操作。

    【讨论】:

    • 对于第一个查询:因为我不想在应用程序中对其进行排序。对于第二个查询:工作完美,但不适合我的 DAL。那好吧。谢谢!
    • @Travis 第二个查询出错。嵌套查询必须在 ORDER BY 之前跟一个 AS [query_name] 语句
    • @AndyStowAway:这可能是您实施的限制。我相当确定匿名子查询没问题(我知道它们在 Postres 和 MySQL 中工作)。
    • 如何使用预定义的列来实现这一点?
    • 将任一查询中的* 替换为您想要的列。选择哪一个并不重要——查询规划器最终会做同样的事情。
    【解决方案2】:

    这应该可行:

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

    【讨论】:

    • 是的,这是一个很好的后翻补充。谢谢!
    【解决方案3】:

    如果您不想使用订单:

    select * from something Offset (select case when count(id)>10 then count(id)-10 end from something)
    

    【讨论】:

      猜你喜欢
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-23
      • 2021-11-07
      • 2017-04-15
      • 2017-03-03
      • 1970-01-01
      相关资源
      最近更新 更多