检索最大/最小记录(Retrieve maximal / minimal record)

2019-09-18 11:49发布

一个相当复杂的SQL查询我工作让我思考(ANSI)SQL的限制:

有没有一种方法来检索记录是最大或最小相对于任意排序?

换一种说法:

鉴于这样的查询:

SELECT * FROM mytable WHERE <various conditions> ORDER BY <order clause>

是否有可能写(通过变换顺序条款到别的可能)只返回第一行查询?

我知道你可以做到这一点使用LIMIT(MySQL的)/ ROWNUM(甲骨文)或类似的,但是这不是标准的SQL。

我也知道,你可以通过在子查询中获取最大/最小值你有兴趣做这个(使用MIN()/ MAX()),然后使用该结果作为你的主要选择,即一个标准:

SELECT * FROM mytable WHERE <various conditions> AND myMaxColumn=(
  SELECT MAX(myMaxColumn) FROM mytable WHERE <various conditions>
)

但是,只有当我想通过一个单一的列进行排序工作。 我看没有办法推广为多列(比嵌套上述溶液等,但由n个coluns订货时,这将意味着2 ^ n指定)。

那么,有没有标准SQL更好的方式比嵌套多个子选择?

一个相关的问题是问在创建一个SQL查询来获取最近的记录 。 然而,问题的答案有建议或者使用LIMIT和朋友,或者使用子查询与MAX()如上所述,这两者是不是我的问题的解决方案。

Answer 1:

SQL:2003定义的窗函数的概念,其中之一:

SELECT  *
FROM    (
        SELECT  *, ROW_NUMBER() OVER (ORDER BY col1, col2, col3) AS rn
        FROM    mytable
        ) q
WHERE   rn = 1

将返回你这第一条记录。

至于现在,它是由支持SQL ServerOracle ,自Jul 01, 2009 ,由PostgreSQL 8.4

但是请注意,这ROW_NUMBER()Oracle比原生的方式效率较低,限制记录(即ROWNUM )。

看到这篇文章在我的博客的性能对比:

  • 甲骨文: ROW_NUMBERROWNUM

SQL:2008提供了一个条款要做到这一点:

SELECT  *
FROM    mytable
ORDER BY
        col1, col2, col3
FETCH FIRST 1 ROW ONLY

,但就目前而言,这个确切的语法被支持DB2只( AFAIK )。



Answer 2:

如果我理解正确的话,你,我想你正在寻找的OVER子句,可以用来分隔结果集,定义为的一部分ANSI SQL 2003标准。

这不是很一致地RDBMS平台上实现。



文章来源: Retrieve maximal / minimal record