Oracle SQL最后n条记录

时间:2014-10-14 13:09:17

标签: sql oracle

我已经通过使用rownum功能阅读了大量关于Oracle SQL中最后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行作为第2行,而是获得第1行,然后是第3行

我应该怎样做才能让最新的日期/时间排在最前面?

3 个答案:

答案 0 :(得分:2)

也许有帮助:

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

答案 1 :(得分:0)

我真的很抱歉让人失望 - 但在甲骨文中没有“最后两个记录”这样的东西。

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

最后插入的记录不是您可以使用数据库查询的内容。

你能做什么?您可以创建一个触发器,使用序列对插入的记录进行排序,并根据它进行选择(所以SELECT * from (SELECT * FROM table ORDER BY seq DESC) where rownum < 3) - 只有在序列CACHE值为1时才能确保顺序。

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

再次 - 由于Oracle的数据结构不是托管的插入顺序,因此Oracle不会查询最后两行,并且在运行“SELECT *”时看到的顺序与某些特定情况下的实际插入无关。 / p>

如果您对此答案的任何部分有任何疑问 - 请在此处发布,我会更专注于更深入地解释。

答案 2 :(得分:0)

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