如何在不使用MAX功能的情况下在列中找到最大值?

Jam*_*mal 4 sql

朋友问我这个问题.您将获得一个只包含一个整数字段的表.如果不使用MAX功能,你能在现场获得最高价值吗?

我想我们可以改变每列的符号,并使用MIN函数找到最小值.那是对的吗?

cod*_*ict 12

是.你可以这样做:

select MIN(-1 * col)*-1 as col from tableName;
Run Code Online (Sandbox Code Playgroud)

或者,LIMIT如果数据库支持该子句,则可以使用该子句.

另一种选择是使用表的自联接.考虑查询:

select A.col, B.col
from tableName as A, tableName as B
where A.col < B.col
Run Code Online (Sandbox Code Playgroud)

它找到所有可能的对并且仅保留第一个字段小于第二个字段的那些对.因此,您的最大值不会出现在第一个字段中,因为它不会低于任何其他值.

您可以将上述查询用作子查询,以仅选择最大值:

select col from tableName where col not in
( select A.col from tableNAme as A, tableName as B
  where A.col < B.col)
Run Code Online (Sandbox Code Playgroud)

如果表具有多个最大值,则上述查询将全部返回.要解决此问题,您可以distinct在外部选择中使用.


bti*_*lly 8

让我们继续用更多的方法来做到这一点!

SELECT DISTINCT t1.col
FROM tableName t1
  LEFT JOIN tableName t2
    ON t2.col > t1.col AND t2.col IS NOT NULL
WHERE t2.col IS NULL
Run Code Online (Sandbox Code Playgroud)


OMG*_*ies 6

为什么你会忽略使用任何数据库支持的功能是任何人的猜测,特别是如果你使用MIN函数,但...

GREATEST

...一些数据库供应商支持GREATEST功能:

SELECT GREATEST(column)
  FROM ...
Run Code Online (Sandbox Code Playgroud)

GREATEST返回指定的所有列的最高值.那些支持GREATEST包括:

TOP/LIMIT

TOP 仅限SQL Server(2000+):

  SELECT TOP 1 column
    FROM YOUR_TABLE
ORDER BY column DESC
Run Code Online (Sandbox Code Playgroud)

LIMIT 只有MySQL,PostgreSQL和SQLite支持

  SELECT column
    FROM YOUR_TABLE
ORDER BY column DESC
   LIMIT 1
Run Code Online (Sandbox Code Playgroud)

ROW_NUMBER

PostgreSQL 8.4 +,Oracle 9i +,SQL Server 2005+支持ROW_NUMBER:

SELECT x.col
  FROM (SELECT column AS col, 
               ROW_NUMBER() OVER (ORDER BY column DESC) AS rank
          FROM YOUR_TABLE) x
 WHERE x.rank = 1
Run Code Online (Sandbox Code Playgroud)

  • @Jamal:是的,'MAX`确实=)剩下的,目前没有人能保证. (3认同)