Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用具有预排序结果的rownum是好的还是应该使用rank?_Sql_Oracle_Rank_Rownum - Fatal编程技术网

Sql 使用具有预排序结果的rownum是好的还是应该使用rank?

Sql 使用具有预排序结果的rownum是好的还是应该使用rank?,sql,oracle,rank,rownum,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 i

我正在编写一个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的评论对此进行了很好的讨论),这两个查询都可以工作,并且返回相同的结果

就我个人而言,我更喜欢分析函数法,因为它适应性更强。您可以通过在
密集秩
行数
分析函数之间交换来调整如何处理关系。如果要运行多个
ID
值而不是一个值的查询,还可以添加
partitionby
子句来返回每个
ID
的最新会议

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


就我个人而言,我更喜欢分析函数法,因为它适应性更强。您可以通过在
密集秩
行数
分析函数之间交换来调整如何处理关系。如果要运行多个
ID
值而不是一个值的查询,还可以添加
partitionby
子句来返回每个
ID
的最新会议

如果存在联系(即,两行的MEETING_DATE值相同),则两个查询可能会给出不同的结果。第一个查询最多返回一行。如果存在联系,第二个查询可能返回多行(因为两行的排名相同)。ROW_NUMBER分析函数与ROWNUM更接近。RANK和ROWNUM/ROW_NUMBER之间的选择取决于您想要如何处理领带。噢:我没有考虑领带…:-)如果存在联系(即,两行的MEETING_DATE值相同),则两个查询可能会给出不同的结果。第一个查询最多返回一行。如果存在联系,第二个查询可能返回多行(因为两行的排名相同)。ROW_NUMBER分析函数与ROWNUM更接近。RANK和ROWNUM/ROW_NUMBER之间的选择取决于您想要如何处理领带。噢:我没有考虑领带…:-)有很多事情要考虑,但我相信你已经给了我想要的答案。分析功能就是为此而设计的,因此仅仅出于目的应该被视为更适合使用。如果需要,更不用说处理领带了。:-)有很多事情要考虑,但我相信你已经给了我想要的答案。分析功能就是为此而设计的,因此仅仅出于目的应该被视为更适合使用。如果需要,更不用说处理领带了。:-)