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

时间:2011-03-21 04:43:54

标签: sql

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

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

6 个答案:

答案 0 :(得分:12)

是。你可以这样做:

select MIN(-1 * col)*-1 as col from tableName;

或者,如果您的数据库支持,则可以使用LIMIT子句。

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

select A.col, B.col
from tableName as A, tableName as B
where A.col < B.col

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

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

select col from tableName where col not in
( select A.col from tableNAme as A, tableName as B
  where A.col < B.col)

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

答案 1 :(得分: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

答案 2 :(得分:6)

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

GREATEST

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

SELECT GREATEST(column)
  FROM ...

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

TOP / LIMIT

TOP仅限SQL Server(2000+):

  SELECT TOP 1 column
    FROM YOUR_TABLE
ORDER BY column DESC

LIMIT仅受MySQL,PostgreSQL和SQLite

支持
  SELECT column
    FROM YOUR_TABLE
ORDER BY column DESC
   LIMIT 1

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

答案 3 :(得分:1)

是的,您可以否定所有内容,然后使用min

当然,这最终会让你否定你想要的价值,然后你必须再次否定它来获得实际价值。

当然,除了学术兴趣之外,我很难相信你会找到一个min函数且没有max的DBMS。

您也可以按该列降序排序,然后只提取第一行,如:

select my_column from my_table
order by my_column desc
fetch first row only;

答案 4 :(得分:0)

按编号desc limit 1使用订单

答案 5 :(得分:0)

以下查询还可以在不使用MAX功能的情况下为特定列提供最大值。

从中选择前1(col) table des order by col desc