gpt4 book ai didi

sql - 检索最大/最小记录

转载 作者:行者123 更新时间:2023-12-03 18:24:48 25 4
gpt4 key购买 nike

我正在处理的一个相当复杂的 SQL 查询让我想到了(ANSI)SQL 的一个限制:

有没有办法检索相对于任意排序最大或最小的记录?

换句话说:

给出这样的查询:

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

是否可以编写仅返回第一行的查询(可能通过将 order 子句转换为其他内容)?

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

我也知道你可以通过在子查询中获取你感兴趣的最大值/最小值来做到这一点(使用 MIN()/MAX()),然后将该结果用作主 SELECT 中的标准,即:
SELECT * FROM mytable WHERE <various conditions> AND myMaxColumn=(
SELECT MAX(myMaxColumn) FROM mytable WHERE <various conditions>
)

但这仅适用于我想按单列排序的情况。我认为没有办法将其推广到多列(除了嵌套上述解决方案,但这意味着按 n 列排序时有 2^n 个 SELECT)。

那么在标准 SQL 中有比嵌套多个子选择更好的方法吗?

相关问题在 Create a SQL query to retrieve most recent records 中提出.但是,那里的答案建议使用 LIMIT 和 friend ,或者如上所述使用带有 MAX() 的子查询,这两者都不是我的问题的解决方案。

最佳答案

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

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

将返回给您第一条记录。

至于现在,它是由 SQL Server 支持的。 , OracleJul 01, 2009 , 来自 PostgreSQL 8.4
但是请注意, ROW_NUMBER()Oracle比限制记录的本地方式(即 ROWNUM )效率低。

有关性能比较,请参阅我博客中的这篇文章:
  • Oracle: ROW_NUMBER vs. ROWNUM
  • SQL:2008提供另一个条款来做到这一点:
    SELECT  *
    FROM mytable
    ORDER BY
    col1, col2, col3
    FETCH FIRST 1 ROW ONLY

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

    关于sql - 检索最大/最小记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1119058/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com