【问题标题】:Query to see the MAX value in Oracle查询以查看 Oracle 中的 MAX 值
【发布时间】:2025-11-20 22:55:02
【问题描述】:

我的 Oracle 数据库(关于机场)中有以下 N:N 表(存储人员登机):

CREATE TABLE boardings(
Passport VARCHAR2(8),
Day DATE,
Flight VARCHAR2(8),
LuggageWeight NUMBER(4,2),
CONSTRAINT pk PRIMARY KEY(Passport, Day, Flight));

我想查询每个航班,哪一天是运输重量最高的一天(请记住,同一航班,例如 RY-1234-VY,可以在不同的日子进行不同的旅行。我一直在尝试这样的事情,但它不起作用:

SELECT Day, Flight
FROM test
GROUP BY Day, Flight
HAVING SUM(LuggageWeight) = (SELECT MAX(SUM(LuggageWeight))
                             FROM test
                             GROUP BY Day, Flight);

【问题讨论】:

  • 当你说:“但它不起作用”是什么意思。您能否向我们展示一些示例数据和该数据的预期结果?
  • 只是为了确定,一个航班可以在一天内进行不同的旅行吗?
  • 添加一些输入和输出应该是什么样子的真实示例。
  • @Trick 似乎您的系统会发布问题,一旦您解决了问题,您就会删除您的帐户,并在需要时创建一个具有相同名称的新帐户。所以你从这个开始:*.com/questions/60464317/…,然后是这个:*.com/questions/60533068/…,现在是这个帖子。花点时间阅读:meta.*.com/questions/251078/…

标签: sql oracle subquery


【解决方案1】:

有几种方法可以解决这个问题。

您可以在公用表表达式中运行一次聚合,然后在子查询中使用它。

with totals as (
  SELECT Day, Flight, SUM(LuggageWeight) total_weight
  FROM test
  GROUP BY Day, Flight
)
select *
from totals
where total_weight = (select max(total_weight) from totals);

或者将分组与窗口函数结合起来:

select day, flight, total_weight
from (
  SELECT Day, Flight, 
         SUM(LuggageWeight) total_weight,
         dense_rank() over (order by SUM(LuggageWeight) desc) as rnk
  FROM test
  GROUP BY Day, Flight
) totals
where rnk = 1;

上面可以很容易地扩展到还包括第二重的飞行等等。由于可见性规则,派生表(子查询)totals 本质上是必需的。

如果您只对单行感兴趣,即使有超过一天/航班组合具有相同(最高)总重量,您也可以使用:

SELECT Day, Flight, SUM(LuggageWeight) total_weight
FROM test
GROUP BY Day, Flight
order by SUM(LuggageWeight) desc
fetch first 1 rows only;

再次重申:上述方案与其他解决方案并不完全相同,但可能已经足够了。

【讨论】:

  • 我认为排序应该是降序以获得最后一个的最大值
【解决方案2】:

我认为你很接近。

SELECT Day, Flight
FROM boardings b1
GROUP BY Day, Flight
HAVING SUM(LuggageWeight) = (SELECT MAX(SUM(LuggageWeight))
                             FROM boardings b2
                             where b1.Flight = b2.Flight -- I have added this line
                             GROUP BY day, flight);

Here is a demo

这样的? :

SELECT Flight, Day
FROM boardings b1
where (Flight, Day) = (SELECT Flight, Day
                     FROM boardings b2
                     where b2.flight = b1.flight
                     GROUP BY Flight, Day
                     order by SUM(LuggageWeight) desc
                     fetch first 1 rows only)

【讨论】:

  • 嗨@Trick 我已经更新了我的答案。我看到你是 * 的新手,如果我的回答是正确的,你可以接受。操作方法如下:*.com/help/someone-answers .
【解决方案3】:

我会将这个问题分为两个心理步骤。首先,您需要对每天每个航班的重量求和,这可以通过在按航班和日期分组的查询中调用 sum 来完成。然后,对于每个航班,您需要找到顶天,这可以通过 rank 窗口函数来完成:

SELECT day, flight, sum_weight
FROM   (SELECT day, flight, sum_weight,
               RANK() OVER (PARTITION BY flight ORDER BY sum_weight DESC) AS rk
        FROM   (SELECT   day, flight, SUM(LuggageWeight) AS sum_weight
                FROM     boardings
                GROUP BY day, flight) t1
       ) t2
WHERE  rk = 1

【讨论】:

    【解决方案4】:

    我想查询每个航班,哪一天是运输重量最高的一天(请记住,同一航班,例如 RY-1234-VY,可以在不同的日子进行不同的旅行。

    一种解决方案使用窗口函数:

    SELECT b.*
    FROM (SELECT Day, Flight, SUM(LuggageWeight) as TotalWeight,
                 RANK() OVER (PARTITION BY Flight ORDER BY SUM(LuggageWeight) DESC) a seqnum
          FROM boardings b
          GROUP BY Day, Flight
         ) b
    WHERE seqnum = 1 
    

    一个解决方案使用两个级别的聚合:

    SELECT Flight, MAX(TotalWeight),
           MAX(Day) KEEP (DENSE_RANK FIRST ORDER BY TotalWeight DESC) as Day
    FROM (SELECT Day, Flight, SUM(LuggageWeight) as TotalWeight,
                 RANK() OVER (PARTITION BY Flight ORDER BY SUM(LuggageWeight) DESC) a seqnum
          FROM boardings b
          GROUP BY Day, Flight
         ) b
    GROUP BY flight;
    

    【讨论】:

      最近更新 更多