如何选择具有 MAX(列值)的第一行?

Posted

技术标签:

【中文标题】如何选择具有 MAX(列值)的第一行?【英文标题】:How can I SELECT the first row with MAX(Column value)? 【发布时间】:2015-12-19 20:56:51 【问题描述】:

我只想从表格中选择一行。此行包含表中的最大数量。我曾尝试使用 MAX Fun,但它对我不起作用。我使用两个表来运行我的查询,第一个查询返回多行

 SELECT Rec_No FROM Records WHERE STATUS = 'Record Replaced'; 

 select Item_No, Quantity from Rec_details
 group by Item_No, Quantity
 having Quantity=max(Quantity);

我在第二个查询中遇到问题,因为我总是得到这些记录

 Item_No     Quantity
 ---------- ----------
  12507          1 
  12549          4 
  12100          8 
  12501          2 
  12201          7 
  12509          3 
  12080          1 

我的答案应该检查记录表中的记录是否被替换,然后从 Rec_Details 中选择最大数量和 Item_no。就我而言,它应该是:

 Item_No     Quantity
---------- ----------
   12201          7 

【问题讨论】:

你在用什么rdbms? ORACLE SQL 开发人员 【参考方案1】:

为什么您的第二个查询不起作用...

select   Item_No,
         Quantity
from     Rec_details
group by Item_No,
         Quantity
having   Quantity=max(Quantity);

您同时按Item_NoQuantity 进行分组,Item_No 似乎是主键并包含唯一值,因此每个组将只包含一行。 HAVING 子句在组内查找,因此它将检查 quantity 的值是否是该组内的最大值,但组内只有一个值,所以这将始终为真。您的查询相当于:

SELECT DISTINCT
       Item_No,
       Quantity
FROM   Rec_details;

其他一些获取最大值的方法:

SQL Fiddle

Oracle 11g R2 架构设置

create table Rec_details (item_no, Quantity ) AS
SELECT 12507,1 FROM DUAL UNION ALL
SELECT 12549,4 FROM DUAL UNION ALL
SELECT 12100,8 FROM DUAL UNION ALL
SELECT 12501,2 FROM DUAL UNION ALL
SELECT 12201,7 FROM DUAL UNION ALL
SELECT 12509,3 FROM DUAL UNION ALL
SELECT 12080,1 FROM DUAL;

查询 1 - 获取最大 quantity 和最新 item_no 的一行(使用 1 表扫描)

SELECT MAX( item_no ) KEEP ( DENSE_RANK LAST ORDER BY Quantity ) AS Item_no,
       MAX( Quantity ) AS Quantity
FROM   Rec_Details

Results

| ITEM_NO | QUANTITY |
|---------|----------|
|   12100 |        8 |

查询 2 - 获取最大 quantity 和最新 item_no 的一行(使用 1 个表扫描)

SELECT *
FROM   (
  SELECT *
  FROM   Rec_details
  ORDER BY Quantity DESC, Item_no DESC
)
WHERE ROWNUM = 1

Results

| ITEM_NO | QUANTITY |
|---------|----------|
|   12100 |        8 |

查询 3 - 获取最大为 quantity 的所有行(使用 1 个表扫描)

SELECT Item_no, Quantity
FROM   (
  SELECT r.*,
         RANK() OVER ( ORDER BY Quantity DESC ) AS rnk
  FROM   Rec_details r
)
WHERE rnk = 1

Results

| ITEM_NO | QUANTITY |
|---------|----------|
|   12100 |        8 |

查询 4 ​​- 获取最大 quantity 的所有行(使用 2 次表扫描)

SELECT Item_no,
       Quantity
FROM   Rec_Details
WHERE  Quantity = ( SELECT MAX( Quantity ) FROM Rec_Details )

Results

| ITEM_NO | QUANTITY |
|---------|----------|
|   12100 |        8 |

【讨论】:

这很有帮助。非常感谢:)【参考方案2】:

在 Oracle 中获得最大值的一种方法是使用 order byrownum

select rd.*
from (select Item_No, Quantity
     from Rec_details
     order by quantity desc
    ) rd
where rownum = 1;

group by 似乎没有必要。

如果有多行数量相同,也可以这样做:

select rd.*
from rec_details rd
where rd.quantity = (select max(quantity) from rec_details);

【讨论】:

你的方法奏效了!谢谢,但我如何更改我的其他查询?【参考方案3】:

Oracle 12 终于引入了 fetch 子句,因此可以非常优雅地完成:

SELECT   Item_No, Quantity
FROM     Rec_details
ORDER BY 2 DESC
FETCH FIRST ROW ONLY

【讨论】:

为什么要包含GROUP BY 子句?没有它,它肯定也能正常工作吗? @MT0 是的,当然。我不知道我是怎么想的。最有可能来自 OP 的复制粘贴错误。固定。【参考方案4】:

使用

select item_no, quantity from rec_details where quantity = (select max(quantity) from rec_details);

这个有点贵,但如果您有多个具有最高值的行并且您想要获取所有具有最高值的行,则可以正常工作。

【讨论】:

SQL 错误:ORA-00923:FROM 关键字未在预期位置找到 等等。我忘记了top 的用法。需要查看top的使用情况。等到那时。【参考方案5】:

试试

select Item_No, Quantity from Rec_details
ORDER BY Quantity DESC LIMIT 1;

【讨论】:

SQL 错误:ORA-00933:SQL 命令未正确结束 00933. 00000 - “SQL 命令未正确结束” LIMIT 在 Oracle 中是无效语法 - 在 Oracle 12 中,您可以按照 Mureinik's answer 使用 FETCH FIRST ROW ONLY【参考方案6】:

mysql 语法

SELECT Item_No, Quantity FROM Rec_details ORDER BY Item_no DESC, Quantity DESC LIMIT 1 

SQL Server/MS 访问语法

SELECT TOP 1 Item_No, Quantity FROM Rec_details ORDER BY Item_no DESC, Quantity DESC

Oracle 语法

SELECT Item_No, Quantity FROM Rec_details WHERE ROWNUM <=1 ORDER BY Item_no DESC, Quantity DESC

【讨论】:

Oracle 版本不正确 - 在单个查询中使用 ROWNUM = 1 将获取一行,then 将执行排序;它不会反过来执行排序然后获取第一(最大)行。

以上是关于如何选择具有 MAX(列值)的第一行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MYSQL 中选择具有 MAX(列值)的行,按另一列进行分区?

SQL / Hive 选择具有特定列值的第一行

如何根据多个最大列值选择一行?

选择最后一组连续行中的第一行

如何在 MySQL 中为每个唯一列值选择两条记录作为一行?

如何在数据工厂中获取 CSV 的第一行和第一列值?