要在Oracle中获得最大相关值?

问题描述 投票:0回答:1

我在Oracle 11g数据库中具有以下表:

CREATE TABLE travels
(
Day DATE,
Flight_Code VARCHAR2(7),
Airplane_Code VARCHAR2(7),
CONSTRAINT pk PRIMARY KEY(day,flight_code)
);

CREATE TABLE boardings
(
Passport VARCHAR2(7),
Day DATE,
Flight_Code VARCHAR2(7),
Luggage_Weight NUMBER(4,2),
CONSTRAINT pk PRIMARY KEY(passport,day,flight_code)
);

因此,我尝试进行查询,以查看每架飞机所运送的最大重量(Day和Flight_Code)是否为最大重量,该重量始终大于100(请注意,相同的航班,例如RY-1234-VY,可以在不同的日子进行不同的旅行,但同一天最多可以旅行一次。]

我一直在尝试类似的方法,但是它不起作用,因为它是在每次飞行后返回的,这是运输更多Luggage_Weight的那天,以及完成该任务的飞机。

SELECT Airplane_Code, Day, Flight_Code
FROM Travels
WHERE (Day, Flight_Code) IN (SELECT Day, Flight_Code
                                 FROM boardings b1
                                 GROUP BY Day, Flight_Code
                                 HAVING SUM(Luggage_Weight) = (SELECT MAX(SUM(Luggage_Weight))
                                                              FROM boardings b2
                                                              WHERE b1.Flight_Code = b2.Flight_Code
                                                              GROUP BY Day, Flight_Code
                                                              HAVING SUM(Luggage_Weight) > 100))
GROUP BY Airplane_Code, Day, Flight_Code;

我想要使用GROUP BY和HAVING结构的解决方案。

例如:

INSERT INTO travels VALUES ('04/04/2020', 'RY1234', 'ABCD');
INSERT INTO travels VALUES ('03/04/2020', 'RY1234', 'ABCD');

INSERT INTO boardings VALUES ('ES1234', '04/04/2020', 'RY1234', '51');
INSERT INTO boardings VALUES ('ES5678', '04/04/2020', 'RY1234', '50');
INSERT INTO boardings VALUES ('ES9101', '03/04/2020', 'RY1234', '100');

如您所见,同一航班(RY1234)在2天中旅行了,所以在03/04中,行李总重量为100kg,但是在04/04中,行李总重量为101kg。结果应该是下一个:

ABCD ---- 04/04/2020 ---- RY1234

如果同一架飞机在任何一次飞行中都不会达到100千克,则不应显示该飞机代码。

oracle performance oracle11g subquery correlated-subquery
1个回答
0
投票
select Airplane_Code,day,Flight_Code from (
Select Airplane_Code,day,Flight_Code ,sum(Luggage_Weight) over (Partition by 
Flight_Code,day) as total_weight
from travels t,boardings b
where t.Flight_Code=b.Flight_Code)data1
where data1.total_weight >100;

0
投票

您可以在派生表中使用dense_rank()将航班按其权重sum()进行排名。然后将其加入travels并过滤等级为1

SELECT t.airplane_code,
       t.day,
       t.flight_code
       FROM travels t
            INNER JOIN (SELECT b.day,
                               b.flight_code,
                               dense_rank() OVER (ORDER BY sum(b.luggage_weight) DESC) dr
                               FROM boardings b
                               GROUP BY b.day,
                                        b.flight_code) x
                       ON x.day = t.day
                          AND x.flight_code = t.flight_code
            WHERE x.dr = 1;

db<>fiddle

© www.soinside.com 2019 - 2024. All rights reserved.