sql - 将 rownum 与预排序结果一起使用是否良好,还是应该使用rank?

标签 sql oracle rank rownum

我正在编写一个 Oracle 查询,需要根据事件发生的日期获取最近的事件。

我有两个查询在我的测试用例中似乎工作正常。

第一个使用子查询按日期顺序获取事件,然后我只需通过 rownum 提取第一条记录:

    SELECT description FROM
    (
     SELECT description FROM tablename
     WHERE ((event_type IN ('A','I','Y')) AND (meeting_date IS NOT NULL) 
     AND id='whatever') 
     ORDER BY meeting_date DESC
    )
    WHERE rownum = 1

第二个使用排名来实现相同的结果:

SELECT description FROM
(
SELECT description, RANK() OVER( ORDER BY meeting_date DESC) mtg_rank 
 FROM tablename 
 WHERE ((event_type IN ('A','I','Y'))  AND (meeting_date IS NOT NULL) 
 AND id= 'whatever') 
)
WHERE mtg_rank = 1

对我来说,预排序的 rownum 足够简单,我会选择它。我意识到 rownum 在排序之前起作用,这就是为什么我首先在​​子选择中进行排序的原因。

但是,我不确定我是否错过了这个想法?

我还想知道在这种情况下排名是否是首选/最佳实践,或者可能更好地传达查询的意图?

最佳答案

除了平局的情况(Brian 的评论对此进行了很好的讨论)之外,这两个查询都可以工作并且返回相同的结果。

就我个人而言,我更喜欢分析函数方法,因为它的适应性更强。您可以通过在 RANKDENSE_RANKROW_NUMBER 分析函数之间交换来调整处理关系的方式。如果您想针对多个 ID 运行查询,您还可以添加一个 PARTITION BY 子句来返回每个 ID 最近的 session > 值(value)观而不仅仅是一个。

关于sql - 将 rownum 与预排序结果一起使用是否良好,还是应该使用rank?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9022701/

相关文章:

php - 在目标页面上通过 GET 变量显示时出现问题

sql - MySQL 查询使用复选框中的多个条件

oracle - 如何使用 dbms_scheduler 安排工作在特定时间运行

c - 存储mpi等级是否会提高性能

php - 如何使用 whereBetween() 从选定的 DB::raw() 值进行查询

sql - 触发检查外键在 PLSQL 中不起作用

java - ORACLE JDBC 批处理执行不返回受影响行的实际计数

php - Mysql 某一用户多列的Rank

mysql - 新的选择列,其计数器根据 SQL 中的条件而增加

php - 为什么 CakePHP 中的创建函数试图保存以前的条目?导致重复输入错误