Oracle SQL 最后 n 条记录

问题描述 投票:0回答:4

我已经阅读了大量有关 Oracle SQL 中使用 rownum 功能的最后 n 条记录的文章,但就我而言,它没有给我正确的行。

我的表中有 3 列:1) message (varchar)、mes_date (date) 和 mes_time (varchar2)。

里面有3条记录:

Hello world | 20-OCT-14 | 23:50
World Hello | 21-OCT-14 | 02:32
Hello Hello | 20-OCT-14 | 23:52

我想获取按日期和时间排序的最后 2 条记录(第一行是最旧的,第二行是最新的日期/时间)

我正在使用这个查询:

SELECT * 
  FROM (SELECT message 
          FROM messages 
         ORDER 
            BY MES_DATE, MES_TIME DESC
       ) 
  WHERE ROWNUM <= 2 ORDER BY ROWNUM DESC;

不是将第 3 行作为第一行和第二行 #2,而是将第 1 行作为第 1 行,然后将第 #3 行作为第二行

我应该怎么做才能让较旧的日期/时间排在最前面,然后是最新的?

sql oracle
4个回答
5
投票

也许有帮助:

SELECT * 
  FROM (SELECT message,
               mes_date,
               mes_time,
               ROW_NUMBER() OVER (ORDER BY TO_DATE(TO_CHAR(mes_date, 'YYYY-MM-DD') || mes_time, 'YYYY-MM-DD HH24:MI') DESC) rank
          FROM messages 
       ) 
  WHERE rank <= 2
  ORDER 
     BY rank

0
投票

我真的很抱歉让你失望了 - 但在 Oracle 中没有“最后两条记录”这样的东西。

表结构在最后不分配数据,并且不保留时间的可见属性(唯一保留的时间是为了“闪回查询”的唯一目的 - 提供截至时间点的结果,例如时间查询开始...)。

最后插入的记录无法使用数据库查询。

你能做什么?您可以创建一个触发器,使用序列对插入的记录进行排序,并基于它进行选择(所以

SELECT  * from (SELECT * FROM table ORDER BY seq DESC) where rownum < 3
) - 仅当序列 CACHE 值为 1 时才能确保顺序。

请注意,如果包含消息日期的列在一秒钟内没有很多事件,您可以使用该列,正如其他解决方案建议的那样 - 例如如果一秒内到达的事件超过 2 个,上面的查询将为您提供随机的两条记录,而不是实际的最后两条记录。

再次 - Oracle 将无法查询插入的最后两行,因为它的数据结构不管理插入顺序,并且在某些特定情况下,您在运行“SELECT *”时看到的顺序与实际插入无关。

如果您对此答案的任何部分有任何疑问 - 将其发布在这里,我将重点更深入地解释它。


0
投票
select * from table
minus
select * from table
where rownum<=(select count(*) from table)-n

0
投票

这是我找到并工作的问题的答案。

表结构:

我想要查询以按降序排列的年份获取最后 4 条记录。

我找到的解决方案

SELECT year, lock_status
    FROM (SELECT YEAR,
                 LOCK_STATUS,
                 ROW_NUMBER () OVER (ORDER BY YEAR DESC)     RANK
            FROM CONTROL_YEAR_UPLOAD_SETTINGS)
   WHERE RANK <= 3
ORDER BY RANK

© www.soinside.com 2019 - 2024. All rights reserved.