如何用MAX(列值)选择第一行?

时间:2015-12-19 20:56:52

标签: sql oracle select

我想从表中只选择一行。此行包含表中的最大数字。我曾试图使用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 

6 个答案:

答案 0 :(得分:1)

在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);

答案 1 :(得分:1)

Oracle 12最终引入了一个fetch子句,所以这可以非常优雅地完成:

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

答案 2 :(得分:1)

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

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

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

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 |

答案 3 :(得分:0)

使用

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

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

答案 4 :(得分:-1)

尝试

session_start();
require_once("twitteroauth/autoload.php");
use Abraham\TwitterOAuth\TwitterOAuth;

$twitteruser = "blah";
$notweets = 30;
$consumerkey = "blah";
$consumersecret = "blah";
$accesstoken = "blah-blah";
$accesstokensecret = "blah";

$connection = new TwitterOAuth($consumerkey, $consumersecret, $accesstoken, $accesstokensecret);
$content = $connection->get("statuses/home_timeline", array("count" => 25,"exclude_replies" => true));
echo json_encode($content); 

答案 5 :(得分:-1)

MySQL语法

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

SQL Server / MS Access语法

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