2

我正在编写一个 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

第二个使用 rank 来完成相同的结果:

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 在排序之前起作用,这就是我首先在子选择中进行排序的原因。

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

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

4

1 回答 1

4

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

就个人而言,我更喜欢分析函数方法,因为它更具适应性。RANK您可以通过在、DENSE_RANKROW_NUMBER分析函数之间交换来调整关系的处理方式。如果您想为多个值而不是一个值 运行查询,您还可以执行诸如添加PARTITION BY子句以返回每个值的最新会议之类的操作。IDID

于 2012-01-26T18:06:50.910 回答