我正在编写一个 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 的评论对此进行了很好的讨论)之外,这两个查询都可以工作并且返回相同的结果。
就我个人而言,我更喜欢分析函数方法,因为它的适应性更强。您可以通过在 RANK
、DENSE_RANK
和 ROW_NUMBER
分析函数之间交换来调整处理关系的方式。如果您想针对多个 ID
运行查询,您还可以添加一个 PARTITION BY
子句来返回每个 ID
最近的 session > 值(value)观而不仅仅是一个。
关于sql - 将 rownum 与预排序结果一起使用是否良好,还是应该使用rank?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9022701/