从更一般的意义上说:是否有一个函数可以让我找到整列,其中列X中的值是列的最大值?
答案 0 :(得分:34)
不是特定功能,不是。
根据需要和数据库支持的功能,有许多方法可以编写查询。
如果有任何共享相同的值,则此方法可能会返回多行:
SELECT x.*
FROM YOUR_TABLE x
WHERE x.column = (SELECT MAX(y.column)
FROM YOUR_TABLE y)
如果有任何共享相同的值,则此方法可能会返回多行:
SELECT x.*
FROM YOUR_TABLE x
JOIN (SELECT MAX(t.column) AS max_col
FROM YOUR_TABLE t) y ON y.max_col = x.column
SQL Server支持TOP
:
SELECT TOP 1
x.*
FROM YOUR_TABLE x
ORDER BY x.column DESC
MySQL& PostgreSQL支持LIMIT
:
SELECT x.*
FROM YOUR_TABLE x
ORDER BY x.column DESC
LIMIT 1
这将返回一行,并且可以配置为每个分组提供最高(或最低)值。但是,此功能是Oracle 9i +,SQL Server 2005+和PostgreSQL 8.4 +。
SELECT x.*
FROM (SELECT y.*,
ROW_NUMBER() OVER (ORDER BY y.column DESC) AS rank
FROM YOUR_TABLE y) x
WHERE x.rank = 1
如果它们共享相同的值,则可以返回多行,并且可以配置为每个分组提供最高(或最低)值。但是,此功能是Oracle 9i +,SQL Server 2005+和PostgreSQL 8.4 +。
SELECT x.*
FROM (SELECT y.*,
DENSE_RANK() OVER (ORDER BY y.column DESC) AS rank
FROM YOUR_TABLE y) x
WHERE x.rank = 1
答案 1 :(得分:0)
SELECT *
FROM mytable
WHERE mycolumn = (
SELECT MAX(mycolumn) FROM mytable
)
答案 2 :(得分:0)
如果我正确地阅读了您的问题,以下查询应该这样做(假设我们的列名是a,b和c,并且a是我们最大化的列):
select a,b,c
from table
where a=(select max(a) from table);
当然,如果您有多行,其中a列达到最大值,那么您将从查询中获得多行。如果你想要一个独特的行,你可以添加“按b,c限制1排序”之类的东西,或者使用其他方法对达到最大值的行进行排名。
答案 3 :(得分:0)
SELECT
*
FROM
YourTable
WHERE
YourColum = (SELECT MAX(YourColumn) FROM YourTable)
答案 4 :(得分:0)
由于指定了表名和列名,因此我将它们作为填充程序保留。 查询将是:
SELECT *
FROM <YOUR_TABLE>
WHERE <YOUR_COLUMN_NAME> = (SELECT MAX(<YOUR_COLUMN_NAME>)
FROM <YOUR_TABLE>)
答案 5 :(得分:0)
我认为以下内容会选择列X中的值等于最大列X值的每一行:
SELECT * FROM [table] WHERE [Column X]=SELECT (MAX([Column X]) FROM [table])
答案 6 :(得分:0)
不久前我和我的朋友谈过,我们讨论了一些不同但非常实际的问题,即将一些“桌子”分成小组,然后为我们获得的每个摸索找到argmax / argmin。更具体地说,假设我们有一个表,我们存储了一些实体的所有版本(意味着所有实体的历史,而活动实体是最新的实体(历史)顶部),那么我们如何才能最有效地选择此表中的活动记录(更准确地说 - 按entity_id(不是row_id)拆分成组,并按版本列在每个摸索中查找argmax)。所以,由于我对“如何调查此问题”的第一个想法是关键词“oracle sql argmax OR argmin”,我在这里发表我的评论。
正如我的朋友说的那样,他们使用[PARTITION BY] [PARTITION-BY]关键字作为他们的手段,正如我从fetch-the-row-which-has-the-max-value-for-a-column和getting-values-relating-to-the-max-and-min-rows-in-oracle所看到的,有两种选择使用DENSE_RANK与“OVER(ORDER BY ...)”然后将该等级绑定为1(如此处和“fetch-the-row-which-has-the-max-value-for-a-column”中所述)或使用类似“max(version)over(partition by entity_id / not row_id /)max_version“然后绑定”version = max_version“,其中causer,如”getting-values-relating-to-the-max-and-min-rows-in-oracle“(”fetch-the-row-which-has-the-max-value-for-a-column“)中所述,我的朋友说他们更喜欢第二种方法,据我所知,因为每个组可能需要较少的计算,因为它只找到一个最大值,而不必完全对每个组进行排序,另一方面,如果有多个记录,相同的最大值,此查询将不会选择唯一一个任意选择的行,其最大值为“排序列”(在我们的案例中为版本),但是所有行(来自组)具有该最大值(因此可以返回Argmax - 不只作为单行,但al以及实现它的一组行。)
另外,据我所知,[Oracle SQL] [oracle-sql-ref]中的[KEEP] [KEEP] [LAST] / [FIRST]关键字旨在涵盖argmin / armax用例,在两种变体中 - [GROUP BY] [GROUP-BY]或[PARTITION BY] [PARTITION-BY]分组,但由于他们认为Argmax和Argmin的结果也可以容纳多行(不仅仅是一行),所以你不能只选择“那行”使用[KEEP] ... [FIRST] / [KEEP] ... [LAST]构造,而不是你使用一些[聚合函数] [Oracle-Sql-Aggregate-Functions]来“提取”一些来自“那些行”(Argmax-rows)的值,如(来自[Oracle doc] [FIRST-Analytic-Example])
MAX(salary) KEEP (DENSE_RANK LAST ORDER BY commission_pct)
OVER (PARTITION BY department_id) "Best"
,其中
KEEP (DENSE_RANK LAST ORDER BY commission_pct) OVER (PARTITION BY department_id)
将Argmax作为一组行提供(在department_id-group上,使用commission_pct作为标准),
MAX(salary)
为您提供了那些Argmax(可能很多)行的最终聚合。 ([选择具有最大值的行] [选择行与最大值] - 讨论是我理解的开始点。)
以下是一些参考文章。
oracle-sql-ref
Oracle-Sql-Aggregate-Functions
KEEP
FIRST
FIRST-Analytic-Example
LAST
Select-row-with-Max-Value
GROUP-BY
PARTITION-BY
ORDER-BY-Analysis
SQL函数/ query_partition_clause
这里有一些关于上述事情的自由引用的片段。
使用[ROW_NUMBER]和[ORDER BY] [ORDER-BY-Analysis]和[PARTITION BY] [PARTITION-BY]
select row_id, entity_id, version, entity_value_1, entity_value_2
from (select row_id, entity_id, version, entity_value_1, entity_value_2,
row_number()
over (partition by entity_id order by version desc) as rank
from Entities) as r
where r.rank=1
将[MAX]与[PARTITION BY] [PARTITION-BY]
一起使用select row_id, entity_id, version, max_version, entity_value_1, entity_value_2
from (select row_id, entity_id, version, entity_value_1, entity_value_2,
max(version) over (partition by entity_id) as max_version
from Entities) as r
where r.version=r.max_version
使用[保持] [保持] [最后] / [第一] 用于抑制具有相同entity_id和版本的多行的可能性在结果中出现(在Argmax行中选择具有最大row_id的唯一行)
SELECT row_id, entity_id, version, max_version, entity_value_1, entity_value_2
FROM (SELECT
row_id, entity_id, version, entity_value_1, entity_value_2,
MAX(row_id)
KEEP (DENSE_RANK LAST ORDER BY version ASC)
OVER (PARTITION BY entity_id)
AS row_id_for_max_version
FROM Entities) as r
WHERE r.row_id=r.row_id_for_max_version
答案 7 :(得分:0)
- 我已经采用了表名= max_search,而column_name是A,B和C
和表中的值是
A B C. 10 20 30 60 40 50 80 90 70
查询: -
选择 (案件 当A&gt; B和A&gt; C那么&#39; A&#39; 当B> A AND B&gt; C那么&#39; B&#39; 当C&gt; B和C&gt;那么&#39; C&#39; END)AS&#34; Column_Name&#34;, 最大(A,B,C)AS Max_Value 来自max_search;
输出: - Column_Name Max_Value C 30 一个60 B 90