SQL中是否有与argmax相同的东西?

时间:2010-12-29 18:18:31

标签: sql

从更一般的意义上说:是否有一个函数可以让我找到整列,其中列X中的值是列的最大值?

8 个答案:

答案 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

LIMIT / TOP:

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

分析 - ROW_NUMBER():

这将返回一行,并且可以配置为每个分组提供最高(或最低)值。但是,此功能是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 

Analytic - DENSE_RANK():

如果它们共享相同的值,则可以返回多行,并且可以配置为每个分组提供最高(或最低)值。但是,此功能是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-columngetting-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

DENSE_RANK
MAX
ROW_NUMBER


这里有一些关于上述事情的自由引用的片段。

使用[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