朋友问我这个问题。您将获得一个只包含一个整数字段的表。如果不使用MAX功能,你能在现场获得最高价值吗?
我认为我们可以改变每列的符号并使用MIN函数找到最小值。那是对的吗?
答案 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功能:
SELECT GREATEST(column)
FROM ...
GREATEST
返回指定的所有列中的最高值。那些支持GREATEST
的人包括:
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
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