我在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千克,则不应显示该飞机代码。
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;
您可以在派生表中使用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;